본문 바로가기
부트캠프 개발일기/Java

12일차: 객체지향 프로그래밍 심화(다형성/Polymorphism, 추상화/Abstraction)

by shyun00 2023. 2. 28.

❯ 다형성(Polymorphism)

다형성

poly(여러개) + morphism(형태, 실체) 의 의미로, 하나의 객체가 여러개의 형태를 가질 수 있는 성질을 의미함

상위 클래스의 참조변수를 통해 하위 클래스 객체를 참조할 수 있도록 허용한것.

(반면 하위 클래스 참조변수로 상위 클래스 객체 참조는 불가능)

⇒ 상위 클래스를 참조변수 타입으로 지정할 경우, 해당 참조변수가 사용할 수 있는 멤버의 개수는 상위 클래스의 멤버의 수와 같음

참조변수의 타입 변환

다르게 표현하자면, 사용할 수 있는 멤버의 개수를 조절하는 것을 의미함

<조건>

  • 서로 상속관계에 있는 상위 - 하위 클래스 사이에만 타입 변환이 가능함
  • 하위 클래스에서 상위 클래스로의 타입변환(업캐스팅)은 형변환 연산자(괄호) 생략 가능
  • 상위 클래스에서 하위 클래스로의 타입변환(다운캐스팅)은 형변환 연산자 반드시 명시해야하며,
    업캐스팅 되어있는 참조변수에 한해서 가능

instanceof 연산자

캐스팅이 가능한지 여부를 boolean 타입으로 확인할 수 있는 문법요소.

참조변수 instanceof 타입  // 참조변수를 해당 타입으로 변환 가능하면 true, 아니면 false 반환

❯ 추상화(Abstraciton)

추상화

핵심적인 개념은 공통성과 본질을 모아 추출하는 것.

기존 클래스들의 공통적인 요소를 뽑아서 상위 클래스를 만들어 내는 것과 유사. (상속의 반대 개념과 비슷)

추상 클래스와 인터페이스라는 문법 요소를 통해서 추상화 구현 가능

abstract 제어자

클래스와 메서드를 형용하는 키워드로 사용되며 메서드 앞에 붙으면 추상 메서드, 클래스 앞에 붙으면 추상 클래스라고 함.

어떤 클래스에 추상 메서드가 포함된 경우 해당 클래스는 자동으로 추상 클래스가 됨

'추상화'의 핵심은 '미완성'이며 추상 클래스만으로는 객체 생성이 불가함

abstract class Example{  // 추상 메서드 하나이상 포함된 추상 클래스
	abstract void start();  // 메서드 바디가 없는 추상 메서드
}

추상 클래스

추상 메서드를 포함하는 미완성 클래스.

<특징>

  • 상속 관계에 있어서 새로운 클래스 작성에 유용함
    ⇒ 메서드 내용이 상속받는 클래스에 따라 달라지므로 유연한 대처 가능(오버라이딩)
  • 추상화를 구현하는데 핵심적 역할을 함
    ⇒ 공통된 속성과 기능을 사전에 정의하여 여러 사람이 작업해도 동일한 변수명 등을 사용해 오류 없이 작업 가능함

계층관계에 있어서 상층부로 갈수록 더 공통적인 속성과 기능이 정의되며, 상층부로 갈수록 추상화 정도가 높음

final 키워드

위  치 기  능
클래스 앞 변경 또는 확장 불가능한 클래스. 상속 불가함
메서드 앞 오버라이딩 불가한 메서드
변수 앞 값 변경이 불가한 상수

인터페이스

두개의 대상을 연결한다는 의미를 가지며, 추상화를 구현하는데 사용됨. 추상 클래스에 비해 더 높은 추상성을 가짐

  • 추상클래스: 추상 메서드를 하나 이상 포함하는점 외에는 일반 클래스와 동일함
  • 인터페이스: 추상 메서드와 상수만을 멤버로 가질 수 있음

class 키워드 대신 interface 키워드를 사용하여 생성.

내부의 모든 필드가 public static final 로 정의되고, static / default 메서드 이외의 모든 메서드가 public abstract로 정의됨

 

인터페이스도 추상 클래스와 마찬가지로 그 자체만으로 인터페이스를 생성할 수 없고, 메서드 바디를 정의하는 클래스가 필요함.

어떤 클래스가 특정 인터페이스를 구현한다면 그 클래스는 인터페이스 내의 모든 추상 메서드를 반드시! 구현해야함.

 

클래스간의 다중상속은 불가능하지만 인터페이스는 다중구현이 가능함. 상속과 인터페이스 구현은 동시에 가능함.

<장점>

  • 기능이 가지는 역할과 구현을 분리시켜 코드 변경의 번거로움을 줄이고 해당 기능을 사용하기 쉽게함
  • 선언과 구현을 분리시켜 독립적인 프로그래밍을 통해 한 클래스의 변경이 다른 클래스 변경에 미치는 영향을 최소화 할 수 있음

 

참고자료

다형성

추상화


객체지향 프로그래밍 심화과정의 이론부분이 끝이 났다.

프로그래밍에서 필수적 요소라고 하는데 코드 예시로 보는것과 실제 코드로 구현해볼때 난이도 차이가 특히 많이 나는 부분인것같다.

마침 내일이 공휴일이라 정규 커리큘럼이 없고 연습해볼 시간이 생겨서 다행이다.

우선 오늘까지 배운걸 전체적으로 복습해보고, 이번주 목금 진행될 미니 프로젝트를 무사히 마칠수 있기를...!