JAVA 객체지향 프로그래밍 심화 2

grapefruit·2022년 9월 7일
0

BE 2022-09.05~09.08

목록 보기
2/2
post-thumbnail

다형성

하나의 객체가 여러 가지 형태를 가질 수 있는 성질을 의미

자바 프로그래밍에서 다형성은 한 타입의 참조변수를 통해 여러 타입의 객체를 참조할 수 있도록 만든 것을 의미한다.

좀 더 구체적으로 이야기하면, 상위 클래스 타입의 참조변수를 통해서 하위 클래스의 객체를 참조할 수 있도록 허용한 것이라 할 수 있다.

‘상위 클래스 타입의 참조변수로 하위 클래스의 객체를 참조하는 것’이자 다형성의 핵심적인 부분'

참조변수의 타입 변환

참조 변수의 타입 변환은 다르게 설명하면 사용할 수 있는 멤버의 개수를 조절하는 것을 의미

타입 변환을 위해서는 다음의 세 가지 조건을 충족해야 한다.

  1. 서로 상속관계에 있는 상위 클래스 - 하위 클래스 사이에만 타입 변환이 가능하다.
  2. 하위 클래스 타입에서 상위 클래스 타입으로의 타입 변환(업캐스팅)은 형변환 연산자(괄호)를 생략할 수 있다.
  3. 반대로 상위 클래스에서 하위 클래스 타입으로 변환(다운캐스팅)은 형변환 연산자(괄호)를 반드시 명시해야 한다.

참조변수의 타입변환은 서로 상속 관계에 있는 관계에서는 양방향으로 자유롭게 수행될 수 있으나, 상위 클래스로의 타입 변환이냐(괄호 생략 가능) 아니면 하위 클래스로의 타입 변환이냐(괄호 생략 불가)에 따라서 약간의 차이가 있다.

instanceof 연산자

instanceof 연산자는 캐스팅이 가능한 지 여부를 boolean 타입으로 확인할 수 있는 자바의 문법요소이다.

1 참조_변수 instanceof 타입

참조_변수 instanceof 타입을 입력했을 때 리턴 값이 true가 나오면 참조 변수가 검사한 타입으로 타입 변환이 가능하며, 반대로 false가 나오는 경우에는 타입 변환이 불가능하다.

추상화

상속이 하위 클래스를 정의하는데 상위 클래스를 사용하는 것이라고 한다면 추상화는 반대로 기존 클래스들의 공통적인 요소들을 뽑아서 상위 클래스를 만들어 내는 것이라고 할 수 있다.

공통적인 속성과 기능을 정의하고 하위 클래스들을 생성할 수도 있고,
반대로 하위 클래스들의 공통성을 모아 상위 클래스를 정의할 수 있다.

abstract 제어자

bstract는 주로 클래스와 메서드를 형용하는 키워드로 사용되는데,
메서드 앞에 붙은 경우를 ‘추상 메서드(abstract method)’,
클래스 앞에 붙은 경우를 ‘추상 클래스(abstract class)’라 각각 부른다.

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

1   abstract class AbstractExample { // 추상 메서드가 최소 하나 이상 포함돼있는 추상 클래스
2	    abstract void start(); // 메서드 바디가 없는 추상메서드
3   }

추상 메서드는 충분히 구체화되지 않은 ‘미완성 메서드’이며, 미완성 메서드를 포함하는 클래스는 ‘미완성 클래스'를 의미하는 추상 클래스가 된다.

추상 클래스미완성 설계도이기 때문에 메서드 바디가 완성이 되기 전까지 이를 기반으로 객체 생성이 불가하다.

추상 클래스

메서드 시그니처만 존재하고 바디가 선언되어있지 않은 추상 메서드를 포함하는 ‘미완성 설계도'

상속계층도의 상층부에 위치할 수록 추상화의 정도가 높고 그 아래로 내려갈수록 구체화된다
다른 말로, 상층부에 가까울수록 더 공통적인 속성과 기능들이 정의되어 있다고 생각하면 될 것 같다.

final 키워드

위치 -> 의미

클래스 -> 변경 또는 확장 불가능한 클래스, 상속 불가
메서드 -> 오버라이딩 불가
변수 -> 값 변경이 불가한 상수

인터페이스

인터페이스의 기본 구조

인터페이스를 작성하는 것은 기본적으로 클래스를 작성하는 것과 유사하지만, class 키워드 대신 interface 키워드를 사용한다는 점에서 차이가 있다.

또한 일반 클래스와 다르게, 내부의 모든 필드가 public static final로 정의되고,
static과 default 메서드 이외의 모든 메서드가 public abstract로 정의된다는 차이가 존재한다.

1   public interface InterfaceEx {
2       public static final int rock =  1; // 인터페이스 인스턴스 변수 정의
3       final int scissors = 2; // public static 생략
4       static int paper = 3; // public & final 생략
5
6       public abstract String getPlayingNum();
7		      void call() //public abstract 생략 
8   }

인터페이스의 구현

1   class 클래스명 implements 인터페이스명 {
2  		  ... // 인터페이스에 정의된 모든 추상메서드 구현
3   }

extends 키워드를 사용하는 클래스의 상속과 기본적으로 동일하지만, “구현하다"라는 의미를 가진 implements 키워드를 사용한다는 점에서 차이가 있다고 할 수 있다.

인터페이스를 구현한 클래스는 해당 인터페이스에 정의된 모든 추상메서드를 구현해야한다.

즉, 어떤 클래스가 특정 인터페이스를 구현한다는 것은 그 클래스에게 인터페이스의 추상 메서드를 반드시 구현하도록 강제하는 것을 의미한다.

다른말로, 어떤 클래스가 어떤 인터페이스를 구현한다는 것은 그 인터페이스가 가진 모든 추상 메서드들을 해당 클래스 내에서 오버라이딩하여 바디를 완성한다 라는 의미를 가진다.

인터페이스의 다중 구현

클래스 간의 상속에서 다중 상속은 허용되지 않는다.

즉, 하위 클래스는 단 하나의 상위 클래스만 상속받을 수 있다.

반면, 인터페이스는 다중적 구현이 가능하다.

클래스에서 다중 상속이 불가능했었던 핵심적인 이유는 만약 부모 클래스에 동일한 이름의 필드 또는 메서드가 존재하는 경우 충돌이 발생하기 때문이었다.

반면, 인터페이스는 애초에 미완성된 멤버를 가지고 있기 때문에 충돌이 발생할 여지가 없고, 따라서 안전하게 다중 구현이 가능하다.

profile
개발자몽

0개의 댓글