부트캠프

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

hunm719 2022. 12. 30. 21:07

1.다형성(polymorphism) : <일반적>하나의 객체가 여러 가지 형태를 가질 수 있는 성질을 의미
자바에서의 다향성 : 상위 클래스 타입의 참조변수를 통해서 하위 클래스의 객체를 참조할 수 있도록 허용한 것

-상위 클래스를 참조변수의 타입으로 지정했기 때문에 자연스럽게 참조변수가 사용할 수 있는 멤버의 개수는 상위 클래스의 멤버의 수가 되며 이것이 상위 클래스 타입의 참조변수로 하위 클래스의 객체를 참조하는 것이자 다형성에서 가장 핵심이다.

-일반적인 상속관계에서 하위 클래스는 <하위 클래스 고유 멤버> + <상위 클래스 멤버> 인데 상위 클래스를 참조변수의 타입으로 지정(다형성)하면 <상위 클래스 멤버>만 사용가능하게됨.

 +하위 클래스의 타입으로 상위 클래스 객체를 참조하는 것은 불가능함.
 +메서드 오버로딩과 메서드 오버라이딩은 다형성의 일반적인 의미와 그 궤를 같이함.

 

1-1.참조변수의 타입 변환 : 사용할 수 있는 멤버의 개수를 조절하는 것
-타입 변한은 아래의 세 가지 조건을 모두 충족해야함.
 (1)서로 상속관계에 있는 상위 클래스 - 하위 클래스 사이에만 타입 변환이 가능합
 (2)하위 클래스 타입에서 상위 클래스 타입으로의 타입 변환(업캐스팅)은 형변환 연산자(괄호)를 생략할 수 있음
 (3)반대로 상위 클래스에서 하위 클래스 타입으로 변환(다운캐스팅)은 형변환 연산자(괄호)를 반드시 명시해야함

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

 

1-2.instanceof 연산자 : 참조변수의 타입 변환, 즉 캐스팅이 가능한 지 여부를 boolean 타입으로 확인하는 문법요소
-소스 코드가 길어지는 등 일일이 생성 객체의 타입을 확인하기가 어려운 상황에서 instanceof 연산자는 형변환 여부를 확인하여 에러를 최소화하는 매우 유용한 수단임
-캐스팅 가능 여부를 판단하기 위해서는 ‘객체를 어떤 생성자로 만들었는가’와 ‘클래스 사이에 상속관계가 존재하는가’를 판단해야함

 

instanceof 연산자 기본구조 : 참조_변수 instanceof 타입

-참조_변수 instanceof 타입을 입력했을 때 리턴 값이 true = 참조 변수가 검사한 타입으로 타입 변환 가능
-참조_변수 instanceof 타입을 입력했을 때 리턴 값이 false = 타입 변환 불가능

 

2.추상화(Abstraction) : <일반적>공통성과 본질을 모아 추출하는 것
 자바에서의 추상화 : 존 클래스들의 공통적인 요소들을 뽑아서 상위 클래스를 만들어 내는 것

+주로 추상 클래스와 인터페이스라는 문법 요소를 사용해서 추상화를 구현함
+공통 속성과 기능을 정의하고 하위 클래스를 생성(하향식 설계)해도 되고, 하위 클래스들의 공통성을 모아 상위 클래스를 정의(상향식 설계)할 수 있음.

 

2-1.abstract 제어자
 자바의 맥락에서 abstract는 미완성의 의미를 내포함.

 (1)추상 메서드(abstract method) : abstract 키워드가 메서드 이름 앞에 붙은 경우
  -메서드의 시그니처만 있고 바디가 없는 메서드를 의미
  -미완성 메서드이며, 이를 포함하는 클래스는 미완성 클래스라는 의미
  -미완성이기 때문에 메서드 바디가 완성이 되기 전까지 이를 기반으로 객체 생성 불가

 (2)추상 클래스(abstract class) : abstract 키워드가 클래스 앞에 붙거나 해당 클래스가 추상 메서드를 포함하는 클래스인 경우
 *어떤 클래스에 추상 메서드가 포함되어있는 경우 해당 클래스는 자동으로 추상 클래스가 됨.
 -객체 생성이 불가능하지만 상속 관계에 있어 새로운 클래스를 작성하는데 매우 유용하며 설계하는 상황이 변하더라도 보다 유연하게 대응 가능
 -오버라이딩을 통해 추상 클래스로부터 상속받은 추상 메서드의 내용을 구현하여 메서드를 완성시킬 수 있고, 이렇게 완성된 클래스를 기반으로 해당 객체를 생성할 수 있음

 +상속계층도의 상층부에 위치할 수록 추상화의 정도가 높고 그 아래로 내려갈수록 구체화된다고 표현함.
 +추상 클래스를 사용하면 상속을 받는 하위 클래스에서 오버라이딩을 통해 각각 상황에 맞는 메서드 구현이 가능하다는 장점이 있음.

 

2-2.final 키워드 : 대상이 더이상 변경이 불가하거나 확장되지 않는 성질을 지니게 함
 final 키워드는 필드, 지역 변수, 클래스 앞에 위치할 수 있으며 그 위치에 따라 그 의미가 조금씩 달라짐

final 키워드 위치별 의미 차이

 *공통적으로 변경이 불가능하고 확장할 수 없다는 점이 핵심

2-3.인터페이스(interface) : 서로 다른 두 시스템, 장치, 소프트웨어를 서로 이어주는 부분 또는 그런 접속 장치
 자바에서의 인터페이스는 기본적으로 추상 메서드와 상수만을 멤버로 가질 수 있는 '추상메서드의 집합'

 (1)인터페이스의 기본 구조
 -class 키워드 대신 interface 키워드 사용
 -내부의 모든 필드가 public static final로 정의됨
 -static과 default 메서드 이외의 모든 메서드가 public abstract로 정의됨

 (2)인터페이스의 구현 방법
 -인터페이스 그 자체로 인스턴스를 생성할 수 없고, 메서드 바디를 정의하는 클래스를 따로 작성해야함
 -클래스명 뒤에 implements 키워드 추가 후 인터페이스명 입력
 *특정 인터페이스를 구현한 클래스는 해당 인터페이스에 정의된 모든 추상메서드를 반드시 구현해야함(오버라이딩 강제)

 (3)인터페이스의 다중 구현
 -클래스 간의 다중 상속은 안 되지만(부모 클래스에 동일한 이름의 필드 또는 메서드가 존재하는 경우 충돌이 발생하기 때문)
 -인터페이스는 다중 구현 가능(애초에 미완성된 멤버를 가지고 있기 때문에 충돌이 발생할 여지가 없음)

 (4)인터페이스의 장점
 -역할과 구현을 분리시켜 사용자 입장에서는 복잡한 구현의 내용 또는 변경과 상관없이 해당 기능을 사용할 수 있음
 -코드 변경의 번거로움을 최소화하고 손쉽게 해당 기능 사용 및 선언과 구현을 분리시켜 개발시간 단축과 독립적인 프로그래밍을 통해 한 클래스의 변경이 다른 클래스에 미치는 영향을 최소화

 

 

이미지 및 내용 출처 - code states