본문 바로가기

분류 전체보기

(666)
인터페이스(8) - 인터페이스의 타입 변환과 다형성 3(배열 객체) 이번에는 인스턴스 객체의 배열형 타입 관리의 케이스와 마찬가지로, 인터페이스 역시 구현 객체를 배열 타입으로 관리해 보는 예제를 확인해 보도록 하겠습니다. 우선, 기존 예제에서 작성되었던 Car 클래스를 살펴보겠습니다. public class Car { Tire frontLeftTire = new HankookTire(); Tire frontRightTire = new HankookTire(); Tire backLeftTire = new HankookTire(); Tire backRightTire = new HankookTire(); void run() { frontLeftTire.roll(); frontRightTire.roll(); backLeftTire.roll(); backRightTire.rol..
[Chapter 3] repository 협업(8) - Release 지금까지 commit과 merge, branch에 대해서 기본적인 사용 방법들을 알아보았습니다. 그런데, 우리가 기본적으로 git과 github(+소스트리)를 사용하는 목적이 '버전' 관리라고 했었습니다. 그럼 결국 이 '버전'을 관리하는 개념에 대해서도 당연히 알아볼 필요가 있겠죠? 프로그램 / 제품이 업그레이드 되거나 업데이트, 패치가 진행될 때 우리는 버전이 명시되는 것을 확인할 수 있습니다. 이 버전 코드나 숫자를 통해 해당 제품의 맥락과 시점을 파악할 수 있게 됩니다. 흔히 [1.0.0] 같은 형태로 버전을 표시하는 것을 많이 보았을 것입니다. 그럼 이 넘버링을 결정하는 기준은 무엇일까요? 사실 버전 명기에 있어서 절대적인 기준이 있는 것은 아니지만 - 대부분 암묵적으로 통용되는 기준은 있습니다..
[CSS] 2. 텍스트 스타일(1) - 폰트 스타일 속성 ○ font-family 속성 : 폰트의 종류 지정 우선 해당 웹 문서에서 적용될 폰트를 지정하는 방식에 대해서 살펴보겠습니다. 주로 , , 태그에서 적용되겠죠? 기본적으로 웹 문서의 폰트 스타일을 지정하게 되면 사용자의 시스템(PC)에 설치된 폰트를 이용하게 됩니다. 그런데 항상 모든 사용자의 PC에 우리가 지정한 폰트가 있을 것이라는 보장은 없습니다. 그래서 font-family 속성에는 두 번째, 세 번째.... 폰트를 미리 설정하여 차순위로 사용할 폰트까지 지정하게 됩니다. 이런 방식으로 폰트를 설정하게 된다면, 애초에 사용자의 PC에 기본적으로 설치되는 폰트를 사용하는 게 좋겠죠? 아래의 사례와 같이, font-family 속성 값으로 다수의 폰트를 우선 순위로 지정하게 될 때는 쉼표(,)를 사..
인터페이스(8) - 인터페이스의 타입 변환과 다형성 2 ○ 자동 타입 변환(promotion) 상속 체계 하에서의 타입 변환과 마찬가지로, 구현 객체가 자식 클래스의 포지션에서 인터페이스 타입으로 변환되는 것이 자동 타입 변환에 해당하게 됩니다. 여기는 기존의 클래스 상속 관련 내용을 잘 이해하고 있다면 특별할 것이 없습니다. 인터페이스타입 변수 = 구현객체; Remotecontrol rc = new Audio(); 한 가지 더 생각할 점이 있습니다. 만일, 어떤 클래스 A가 특정 인터페이스를 구현한 클래스인데 - 이 클래스 A를 상속하는 자식 클래스 B가 있다면 타입 변환은 이루어질까요? 정답은 '타입 변환이 이뤄진다'입니다. 자식 클래스 타입 B를 인터페이스 변수에 대입한다면, 자동 타입 변환이 동일하게 이루어집니다. 기존에 클래스의 부모 자식관계 상속 ..
[Chapter 3] repository 협업(7) - Pull Request 지금까지 병합 과정에서, 우리는 몇 가지 원칙을 만들어 운영한다고 했습니다. 애초에 마스터 브랜치에 직접 커밋을 진행하지 않고, 피처 브랜치를 만들어 병합하는 것 자체도 일종의 사고 방지를 위한 대원칙입니다. 다만, git의 기능 레벨에서 이러한 절차를 보강할 필요가 있겠죠? 피처 브랜치에서 마스터 브랜치로 병합하는 과정에서도, 협력자가 사전에 검토할 수 있도록 사전에 확인 과정을 거치는 기능이 바로 풀 리퀘스트(Pull Request)입니다. 우선 기존 실습 환경에서, 새로운 피처 브랜치를 하나 생성하고 커밋하는 과정에서 풀 리퀘스트를 사용하며 배워보도록 하겠습니다. 우선 기존까지 진행된 작업물의 상태에서 새로운 피처 브랜치를 생성해 보겠습니다. [feature/memo] 브랜치를 생성해서 새로운 커밋..
인터페이스(8) - 인터페이스의 타입 변환과 다형성 1 상속 파트에서 우리는 다형성에 대해서 다루었습니다. 하나의 타입에 대입되는 인스턴스의 종류에 따라서, 그 실행 결과가 달라지는 성질을 확인했죠(부모 타입에 어떤 자식 객체를 대입하느냐에 따라 달라지는 결과). 인터페이스 타입에 구현 클래스 인스턴스가 어떤 것이 적용되느냐에 따라서도 그 실행 결과가 달라지는 것을 확인했습니다. 물론 부모-자식과 인터페이스-구현 간의 관계는 계층적 차이가 있어서 엄격하게는 다른 개념이지만, 동일한 형질을 통해서 다양한 결과를 구현할 수 있다는 점은 동일합니다. 실제 사례를 예로 들어서, 인터페이스 다형성에 기반한 구조 설계를 살펴보겠습니다. 우선 XXX라는 클래스를 사용하여 프로그램 개발을 진행했다고 가정해 보겠습니다. 그런데, XXX클래스가 전반적으로 결함이 있어서 메서드..
[CSS] 1. CSS의 기본 개념(4) - Cascading CSS에서 C는 Cascading의 줄임말입니다. 단어 그대로, 계층성을 가진다는 의미를 갖죠. 스타일 시트를 형용하는 가장 중요한 단어로 사용될 만큼, 이 계층 구조는 중요한 의미를 갖습니다. 근본적으로 웹 문서의 요소에 스타일을 적용할 때, 우선순위를 두고 적용된다는 것이지요. 스타일을 적용하다 보면 여러 가지 이유로 다양한 스타일이 적용될 때 충돌이 발생할 수 있습니다. 이럴 때 스타일 적용 규칙을 설정하는 방식은 우선순위 / 상속이 있습니다. 우선순위는 말 그대로 중요도와 적용 범위의 기준을 따른다는 의미고, 상속은 태그 간의 포함 관계에 따라서 부모 요소에서 자식 요소로 전달되는 방식을 뜻합니다. 바로 와닿지 않으니, 상세히 살펴보도록 하겠습니다. ○ 스타일 우선순위 말 그대로 스타일 적용에 있..
인터페이스(7) - 인터페이스의 구현과 사용 2 : 디폴트, 정적 메서드 ○ 인터페이스의 디폴트 메서드 사용 디폴트 메서드는 인터페이스의 모든 인스턴스가 자동으로 보유하게 되는 말 그대로 '기본' 메서드입니다. 별다른 오버라이드 없이도, 기본적인 추상 메서드 구현만 잘 이루어졌다면 특별한 구현 클래스에서의 작업 없이 사용이 가능하죠. 실행 코드는 이미 인터페이스 상에 선언이 되어 있습니다. 물론, 엄격하게 구조를 따지면 인터페이스 상에 실행 코드가 정의되어 있긴 하지만 - 실제로는 구현 클래스 인스턴스가 보유하고 있는 구조라고 생각해야 합니다. 그리고 위의 문장에서 구현 클래스의 인스턴스가 보유하는 메서드라고 말했습니다. 이 부분을 강조하는 이유는 무엇일까요? 그건 인터페이스에 실행 코드가 선언되어 있긴 하지만, 반드시 구현 클래스 인스턴스를 통해서만 실행이 가능한 메서드이기..