개발자 꼬부기의 성장일기
12일차 - Java 객체지향 심화(2) : 다형성, 추상화 본문
다형성 & 추상화
다형성과 추상화 공부하니 더 머릿속이 복잡해졌다. 이걸 이용해서 어떻게 프로그래밍하지...내일 실습도 어떻게 하지... 걱정이 앞선다.
다형성
: 하나의 객체가 여러 가지 형태를 가질 수 있는 성질
- 한 타입의 참조 변수를 통해 여러 타입의 객체를 참조할 수 있도록 만든 것.
- 오버로딩과 오버라이딩 개념을 두가지 다 포함하고 있다.
- 동적 바인딩 혹은 Late Binding이라고도 한다.
- 상위 클래스 타입의 참조 변수로 하위 클래스의 객체를 참조하는 것
class Friend {
public void friendInfo() {
System.out.println("나는 당신의 친구입니다.");
}
}
class BoyFriend extends Friend {
public void friendInfo() {
System.out.println("나는 당신의 남자친구입니다.");
}
}
class GirlFriend extends Friend {
public void friendInfo() {
System.out.println("나는 당신의 여자친구입니다.");
}
}
public class FriendTest {
public static void main(String[] args) {
Friend friend = new Friend(); // 객체 타입과 참조 변수 타입의 일치 -> 가능
BoyFriend boyfriend = new BoyFriend();
Friend girlfriend = new GirlFriend(); // 객체 타입과 참조 변수 타입의 불일치 -> 가능
// GirlFriend friend1 = new Friend(); -> 하위클래스 타입으로 상위클래스 객체 참조 -> 불가능
friend.friendInfo();
boyfriend.friendInfo();
girlfriend.friendInfo();
}
}
GirlFriend클래스가 Friend클래스를 상속받고 있지만 상위객체(Friend)로 생성하는데 하위객체(GirlFriend)의 타입으로 생성은 불가능하다.
참조 변수의 타입 변환
세 가지 조건
- 서로 상속 관계에 있는 상위 클래스 - 하위 클래스 사이에만 타입 변환이 가능하다.
- 하위 클래스 타입에서 상위 클래스 타입으로의 타입 변환(업캐스팅)은 형 변환 연산자(괄호)를 생략할 수 있다.
- 반대로 상위 클래스에서 하위 클래스 타입으로 변환(다운캐스팅)은 형 변환 연산자(괄호)를 반드시 명시해야 한다.
- 또한, 다운 캐스팅은 업 캐스팅이 되어 있는 참조 변수에 한해서만 가능하다.
class Vehicle {
String model;
void startEngine() {
System.out.println("시동");
}
void accelerate() {
System.out.println("엑셀 밟기");
}
void brake() {
System.out.println("멈춤!");
}
}
class Car extends Vehicle {
void giveRide() {
System.out.println("사람 태우기");
}
}
class MotorBike extends Vehicle {
void performance() {
System.out.println("퍼포먼스");
}
}
public class VehicleTest {
public static void main(String[] args) {
Car car = new Car(); //car라는 객체를 생성
Vehicle vehicle = (Vehicle) car; // 상위 클래스 Vehicle 타입으로 변환(생략 가능)
Car car2 = (Car) vehicle; // 하위 클래스 Car타입으로 변환(생략 불가능)
// 업 캐스팅이 되어있다는 전제하에 다운 캐스팅을 할 수 있다.
MotorBike motorBike = (MotorBike) car; // 상속 관계가 아니므로 타입 변환 불가 -> 에러발생
}
}
instanceof 연산자
: 캐스팅이 가능한지 여부를 boolean 타입
참조_변수 instanceof 타입
true가 나오면 참조 변수가 검사한 타입으로 타입 변환이 가능하며,
반대로 false가 나오는 경우에는 타입 변환이 불가능
추상화
공통성과 본질을 모아 추출해 놓은것
자바에서는 주로 추상 클래스와 인터페이스라는 문법 요소를 사용해서 추상화를 구현한다.
abstract 제어자
추상적인 , 미완성 ..
어떤 클래스에 추상 메서드가 포함되어 있는 경우 해당 클래스는 자동으로 추상 클래스가 된다.
abstract class AbstractExample { // 추상 메서드가 최소 하나 이상 포함돼있는 추상 클래스
abstract void start(); // 메서드 바디가 없는 추상메서드
}
Animal 이라는 추상화 클래스가 있고 Dog과 Cat이라는 Animal을 상속받는 클래스가 있다.
sound라는 추상메서드가 있으면 Dog과 Cat에 각각 sound라는 메서드를 가지고 있고 다르게 구현 할 수 있다.
abstract class Animal {
public abstract void sound();
}
class Dog extends Animal { // Animal 클래스로부터 상속
public void sound() { // 메서드 오버라이딩 -> 구현부 완성
System.out.println("멍멍");
}
}
class Cat extends Animal { // Animal 클래스로부터 상속
public void sound() { // 메서드 오버라이딩 -> 구현부 완성
System.out.println("야옹");
}
}
상속의 상층부에 위치할수록 추상화의 정도가 높고 아래로 내려갈수록 구체화된다.
상층부에 가까울수록 더 공통적인 속성과 기능들이 정의되어 있다.
Final 키워드
final class FinalEx { // 확장/상속 불가능한 클래스
final int x = 1; // 변경되지 않는 상수
final int getNum() { // 오버라이딩 불가한 메서드
final int localVar = x; // 상수
return x;
}
}
인터페이스
: 두 개의 다른 대상 사이를 연결한다는 의미
- 기본적으로 추상 메서드와 상수만을 멤버로 가질 수 있다.
- 추상 메서드의 집합으로 이뤄져 있다.
- 추상 클래스에 비해 추상화 정도가 더 높다.
class 키워드 대신 interface 키워드를 사용한다.
내부의 모든 필드가 public static final로 정의된다.
static, default 외에는 모든 메서드가 public abstract로 정의된다.
class 클래스명 implements 인터페이스명 {
... // 인터페이스에 정의된 모든 추상메서드 구현
}
class ExampleClass implements ExampleInterface1, ExampleInterface2, ExampleInterface3 {
... 생략 ...
}
'언어공부 > [코드스테이츠] 백엔드부트캠프' 카테고리의 다른 글
16일차 - 코플릿 문제풀기(컬렉션) (0) | 2023.05.02 |
---|---|
15일차 - Java 컬렉션 (열거형, 제너릭, 예외처리, 컬렉션프레임워크) (0) | 2023.05.01 |
11일차 - Java 객체지향 심화(1) : 상속, 캡슐화 (0) | 2023.04.25 |
10일차 - Java 객체지향 기초(2) : 생성자, 내부클래스 (0) | 2023.04.24 |
9일차 - Java 객체지향 기초(1) : 클래스와 객체, 필드와 메서드 (0) | 2023.04.21 |