실제로 코드를 구현하라고 하면 물론 어렵고 생각도 안나고 힘들겠지만, 일단 개념을 이해했다는 것에서 너무 만족스러운 하루였다.
이제까지는 이해도 못하고 구현도 못해서 우울했는데, 그래도 내가 이해는 할 수 있는 사람이었구나 라는걸 느낄 수 있어서 행복하고 앞으로 더 열심히 할 수 있을것만같은 기분이 든다.
내일것을 잠깐 보니까 주문프로그램을 만드는 것 인데,, 잘 할수 있을지는 모르겠지만 그래도 이제까지 정리 해 둔것을 다시 읽고 알아보면서 천천히 해보면 그래도 만들수 있지 않을까....?
오늘 편안하게 공부했으니 내일은 빡세게 해보자!
# 다형성 (Polymorphism)
- 다형성의 의미와 장점을 이해할 수 있다.
- 참조변수의 타입 변환에 대한 내용을 이해하고, 업캐스팅과 다운캐스팅의 차이를 설명할 수 있다.
- instanceof 연산자를 활용하는 방법을 이해하고, 설명할 수 있다.
- 다형성이 실제로 어떻게 활용되는지 알 수 있다.
# 추상화 (Abstraction)
- 추상화의 핵심 개념과 목적을 알 수 있다.
- abstract 제어자가 내포하고 있는 의미를 이해하고, 어떻게 사용되는지 설명할 수 있다.
- 추상 클래스의 핵심 개념과 기본 문법을 이해할 수있다.
- final 키워드를 이해하고 설명할 수 있다.
- 추상화에서 핵심적인 역할을 수행하는 인터페이스의 개념과 활용 방법을 이해할 수 있다.
- 추상 클래스와 인터페이스의 차이를 설명할 수 있다.
1. 다형성 이란?
: poly(여러개) + morphism(실체/형태) = 하나의 객체가 여러가지 형태를 가질 수 있는 성질
: 자바에서의 다형성
→ 한 타입의 참조변수를 통해 여러타입의 객체를 참조할 수 있도록 만든 것
→ 상위 클래스 타입의 참조변수를 통해, 하위 클래스의 객체를 참조할 수 있도록 허용한 것
: 하위클래스의 객체를 상위 클래스의 참조변수타입으로 지정하면
→ 하위 클래스의 참조변수가 사용할 수 있는 멤버의 개수는 상위클래스 멤버의 수가 됨
: 하위 클래스의 타입으로 상위클래스 객체를 참조하는 것은 불가능
Friend friend = new Friend(); // 객체 타입과 참조 변수 타입의 일치 -> 가능
BoyFriend boyfriend = new BoyFriend();
Friend girlfriend = new GirlFriend(); // 객체 타입과 참조 변수 타입의 불일치 -> 가능
// GirlFriend friend1 = new Friend(); -> 하위클래스 타입으로 상위클래스 객체 참조 -> 불가능
2. 참조 변수의 타입 변환
: 사용할 수 있는 멤버의 개수를 조절하는 것
→ 서로 상속관계에 있는 상위-하위 클래스 에서만 타입변환이 가능
→ 하위에서 상위 클래스 타입으로 변환(업캐스팅)은 형 변환 연산자(괄호)를 생략 가능
→ 상위에서 하위 클래스 타입으로 변환(다운캐스팅)은 형 변환 연산자(괄호) 필수! ( 업 캐스팅이 되어있다는 전제하에 다운 캐스팅이 가능)
(헷갈리지 않으려면 그냥 형 변환 연산자를 항상 사용하는 것도 나쁘지는 않을 듯..?)
3. instanceof 연산자
: 캐스팅이 가능한지 여부를 boolean 타입으로 확인 하는 문법
→ 생성 객체의 타입을 확인하기가 어려운 상황에서 instanceof 연산자는 형 변환 여부를 확인하여 에러를 최소화하는 매우 유용한 수단
참조_변수 instanceof 타입
System.out.println(animal instanceof Object);
// 해석 : 참조변수 animal 을 Object로 타입변환을 할 수 있는가?
4. 다형성 활용
: 중복으로 써야 하는 코드를 현저히 줄이고 보다 편리하게 코드를 작성할 수 있음
1. 추상화 란?
- 추상의 사전적 정의
: 사물이나 표상을 어떤 성질, 공통성, 본질에 착안하여 그것을 추출하여 파악하는것
→ 기존 클래스 들의 공통적인 요소들을 뽑아서 상위 클래스를 만들어 내는 것
2. abstract 제어자
: 클래스와 메서드를 형용하는 키워드로 주로 사용
: 추상 메서드 (메서드 앞에 붙은 경우), 추상 클래스 (클래스 앞에 붙은 경우)
→ 클래스에 추상 메서드가 포함되어 있으면 그 클래스는 자동으로 추상 클래스가 됨
- 추상 메서드 (abstract method)
: 메서드 시그니처만 있고, 바디가 없음
→ 앞에 abstract을 붙여서 해당 메서드가 추상 메서드 임을 표시
→ 구체화 되지 않은 미완성 메서드 (바디가 없어서 구체적으로 명시되지 않음)
AbstractExample abstractExample = new AbstractExample(); // 에러발생.
→ 미완성 이기 때문에 메서드 바디가 완성되기 전까지는 객체 생성또한 불가능
3. 추상 클래스 (abstract class)
: 상속 관계에 있어 새로운 클래스를 작성하는데 매우 유용
: 메서드의 내용이 상속받는 클래스에 따라 달라지기 때문에 선언부만 작성하고 바디는 상속받는 하위 클래스에서 구현하도록 비워둠 → 보다 유연하게 변화에 대응 가능
→ 추상메서드를 하나이상 포함하는것 외에는 일반클래스와 동일
→ 상속을 받는 하위 클래스에서 오버라이딩을 통해 각각 상황에 맞는 메서드 구현이 가능함
상속계층도의 상층부에 위치할수록 추상화의 정도가 높고 그 아래로 내려갈수록 구체화
즉, 상층부에 가까울수록 더 공통적인 속성과 기능들이 정의됨
4. final 키워드
: 핃드, 지역 변수, 클래스 앞에 위치할수 있고 위치에 따라 의미가 달라짐
위치 | 의미 |
클래스 | 변경 또는 확장 불가능한 클래스, 상속 불가 |
메서드 | 오버라이딩 불가 |
변수 | 값 변경이 불가한 상수 |
→ 공통적으로 변경불가, 확장불가
final class FinalEx { // 확장/상속 불가능한 클래스
final int x = 1; // 변경되지 않는 상수
final int getNum() { // 오버라이딩 불가한 메서드
final int localVar = x; // 상수
return x;
}
}
(final 클래스를 만들고, 그 안의 메서드나 변수에 final을 사용하지 않았을 경우 final 클래스의 영향을 받아 내부의 아이들도 final이 되는건지 궁금해서 chatGPT에게 물어봄 → final 키워드는 각각 설정해야 변경불가 성질을 가지게 됨, final 클래스를 만들었다고 해서 그 내부까지 final은 아니기 때문에 상속만 불가능하고 내부값은 변경이 가능함)
5. 인터페이스 (interface)
: 서로 다른 두 시스템, 장치, 소프트웨어 등을 이어주는 부분/접속장치
: 추상클래스보다 더 높은 추상성을 가지는 가장 기초적인 밑그림
→ 추상메서드와 상수만을 멤버로 가질수 있음(추상화 정도 ↑, 추상메서드의 집합)
- 기본 구조
: class 대신 interface 사용
: 내부의 모든 필드가 public static final 로 정의됨
: static과 default메서드 외의 모든 메서드는 public abstract로 정의 됨
→ 다만 모든 인터페이스의 필드와 메서드에는 위의 내용이 내포되어 있기 때문에 생략이 가능함
- 구현
: 그 자체로 인스턴스 생성이 불가능, 메서드바디를 정의하는 클래스를 따로 작성해야함
→ implements 키워드 사용
→ 인터페이스를 구현한 클래스는 모든 인터페이스의 메서드를 구현해야 하지만, 디폴트 메서드나 정적 메서드는 선택적으로 구현할 수 있다.
class 클래스명 implements 인터페이스명 {
... // 인터페이스에 정의된 모든 추상메서드 구현
}
→ 어떤 클래스가 어떤 인터페이스를 구현한다는 것은 그 인터페이스가 가진 모든 추상 메서드들을 해당 클래스 내에서 오버라이딩하여 바디를 완성한다는 의미
- 다중구현
: 상속(extends)과는 달리 인터페이스(interface)는 다중구현이 가능함
→ 하나의 클래스가 여러개의 인터페이스를 구현할 수 있음.
→ 다만, 인터페이스-인터페이스 끼리만 상속이 가능하고 클래스와는 달리 최고 조상이 존재하지 않음
[ 다중상속(다중구현)이 가능한 이유 : 클래스는 부모와 자식 모두 멤버를 가지고 있어서 충돌이 발생하지만, 인터페이스는 미완성된 멤버를 가지고 있기 때문에 충돌하지 않음 ]
interface Animal { // 인터페이스 선언. public abstract 생략 가능.
public abstract void cry();
}
interface Pet {
void play();
}
class Dog implements Animal, Pet { // Animal과 Pet 인터페이스 다중 구현
public void cry(){ // 메서드 오버라이딩
System.out.println("멍멍!");
}
public void play(){ // 메서드 오버라이딩
System.out.println("원반 던지기");
}
}
업캐스팅 / 다운캐스팅
타입변환은 왜 하는지?
다형성 Object
non-static method buyCoffee(Coffee) cannot be referenced from a static context
위에서 만든 customer 객체를 가져와서 buyCoffee()를 호출 해야 하는데 C를 대문자로 잘못 적어서 오류가 남
# BurgerQueen 주문 프로그램 만들기
↓ 이전 글 ↓
↓ 코트스테이츠 부트캠프 관련 글 한번에 보기 ↓
[코드스테이츠] 05_03_TIL : 애너테이션, 람다, 스트림 (1) | 2023.05.03 |
---|---|
[코드스테이츠] 05_01_TIL : 컬렉션 (Collection) (0) | 2023.05.01 |
[코드스테이츠] 04_25_TIL : 객체지향 _ 상속과 캡슐화 (0) | 2023.04.25 |
[코드스테이츠] 04_24_TIL : 객체지향 _ 생성자와 이너클래스 (0) | 2023.04.24 |
[코드스테이츠] 04_21_TIL : 객체지향 _ 클래스, 객체, 필드, 메서드 (0) | 2023.04.21 |