Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- MVC 패턴
- github
- 데이터베이스
- dql
- 마크다운
- 쿠버네티스 기본 개념
- 프로그래밍 기초
- DDL
- 웹개발 기초
- view
- java 기초
- docker
- 필기
- mybatis
- 도커
- VS Code
- docker 소개
- DB 모델링
- Flutter
- 기초 선택자
- 깃허브
- 쿠버네티스
- ORACLE 기초
- DB
- 정보처리기사
- DB 개요
- java
- oracle
- 기본 API
- SQL
Archives
- Today
- Total
핑구
08. 다형성 본문
📅 2021.08.26
다형성
- 여러 개의 형태를 가진다는 의미로 하나의 행동으로 여러 가지의 일을 수행한다는 개념이다.
- 상속을 이용하여 부모 타입으로부터 파생된 여러 가지 타입의 자식 객체를 부모 클래스 타입 하나로 다룰 수 있는 기술을 다형성이라고 한다.
클래스 형변환
- 업 캐스팅
- 상속 관계에 있는 부모, 자식 클래스 간에서 부모 타입의 참조형 변수가 모든 자식 타입의 객체 주소를 받을 수 있는 것을 말한다.
- 다형성의 기본이 된다.
- 자식 객체를 만들면 heap 영역에 생성된 자식 객체의 공간에 부모 객체도 담겨져 있으므로 부모의 멤버를 호출할 수 있다.
부모 타입 레퍼런스 변수로 자식 객체를 받는 경우, heap 영역에 자식 객체와 부모 객체가 모두 담겨져 있으나 부모 객체의 멤버만 호출이 가능하다.(자식 객체의 멤버는 호출이 불가능하다.)
이는 자식 객체가 해당 공간에 생성되어 있다고 하더라도 변수가 부모 타입이기 때문에 부모의 멤버만 보겠다는 의미가 되기 때문이다. - 자식 타입 레퍼런스 변수로 부모 객체를 저장하는 것은 불가능하다. 반대의 경우 자식 객체의 공간에 자식 객체, 부모 객체가 모두 생성되어 있지만, 해당 경우에는 자식 객체만 생성되어 있기 때문에 존재하지 않는 것을 불러올 수는 없다.
- 다운 캐스팅
- 자식 객체의 주소를 받은 부모 참조형 변수가 자식의 멤버를 참조해야 하는 경우에 부모 클래스 타입의 참조형 변수를 형변환하는 것을 말한다.
((자식 클래스 타입) 부모 레퍼런스 변수).자식 멤버; - 자동으로 처리되지 않기 때문에 반드시 자식 타입을 명시하여 형변환을 진행 후 사용하여야 한다.
- 자식 객체의 주소를 받은 부모 참조형 변수가 자식의 멤버를 참조해야 하는 경우에 부모 클래스 타입의 참조형 변수를 형변환하는 것을 말한다.
다형성의 사용 예시
- 객체 배열과 다형성 : 다형성을 이용하여 상속 관계에 있는 하나의 부모 클래스 타입의 배열 공간에 여러 종류의 자식 클래스 객체를 저장할 수 있다.
다형성을 사용하지 않는 경우에는 각 객체별로 변수를 만들어 주어서 여러 개의 변수를 관리해야 하나, 다형성을 사용하는 경우에는 부모 객체의 배열 하나로(변수 하나로) 모든 객체를 관리할 수 있다. - 매개 변수와 다형성 : 다형성이 주로 사용되는 부분이며, 다형성을 이용하여 메소드 호출 시 부모 타입의 변수 하나만 사용해 자식 타입의 객체를 받을 수 있도록 한다.
가장 보편적인 예시는 println 메소드이다. pritln()을 이용하면 Sonata s = new Sonata(); System.out.println(s);과 같은 형태로 모든 객체 변수를 바로 출력할 수 있다. 이때 만약 다형성이 없다면 클래스는 각각의 자료형이기 때문에 각각 println() 메소드에 따로 정의하여야 출력이 가능하다. 하지만 클래스는 직접 작성할 수 있는 부분이기 때문에 자바에서 모든 클래스를 작성하는 것은 불가능하다. 하지만 다형성을 이용해 모든 클래스의 최상위 부모 클래스인 Object만을 이용해 정의, 사용이 가능하다.
instanceof 연산자
- 현재 참조형 변수가 어떤 클래스 형의 객체 주소를 참조하고 있는지 확인할 때 사용하는 연산자이다.
- 참조형 변수 instanceof 클래스명의 형태로 사용하며, 클래스명의 객체 주소를 참조하고 있는 경우 true, 참조하지 않는 경우 false를 반환한다. boolean 형태로 결과가 도출되므로 조건식에 주로 사용된다.
바인딩
- 실제 실행할 메소드와 호출하는 코드를 연결시키는 것으로 특별한 상황이 아닌 경우에는 항상 정적 바인딩이 진행된다.
a.print();라는 코드가 존재할 경우 어느 print() 메소드를 사용할 것인지에 대해 지정해 주는 것이다. - 정적 바인딩 : 프로그램이 실행되기 전에 이루어지는 것으로, 코드만 보고 연결하는 것을 의미한다.
- 동적 바인딩 : 컴파일 시 정적 바인딩 된 메소드를 실행할 당시의 객체 타입을 기준으로 바인딩하는 것을 의미한다. 보통의 경우 정적 바인딩이 진행되지만, 동적 바인딩의 성립 요건을 충족하는 경우에는 동적 바인딩이 진행된다.
- 동적 바인딩의 성립 요건 (모두 충족하여야 한다)
- 상속 관계로 이루어져 다형성이 적용되어 있어야 한다.
- 메소드 오버라이딩이 되어 있어야 한다.
추상 클래스
- 추상 클래스(abstract class) : 몸체 없는 메소드를 포함한 클래스이며, 선언부에 abstract 키워드를 사용한다.
[접근제한자] abstract class 클래스명 {} - 추상 클래스의 특징
- 미완성 클래스이다. 따라서 자체적으로 객체 생성이 불가능하며, 반드시 상속하여 자식에서 객체를 생성하여야 한다.
- 추상 메소드(abstract method)가 포함된 클래스는 모두 추상 클래스이지만, 추상 메소드가 포함되어야만 추상 클래스가 될 수 있는 것은 아니다. 추상 메소드가 존재하지 않는 경우에도 해당 클래스의 객체를 만들고 싶지 않거나, 추상 클래스의 의미를 가진다면 추상 클래스로 선언이 가능하다.
추상 클래스의 의미란 부모로서 자식에게 공통적인 의미를 주는 경우를 뜻한다. - 추상 클래스 내에 일반 변수와 일반 메소드를 포함할 수 있다.
- 추상 클래스의 객체 생성은 불가능하지만, 참조형 변수 타입으로는 사용이 가능하다.
- 추상 클래스의 장점 : 일관된 인터페이스의 제공이 가능하다. 공통적이나 자식 클래스에서 특수화되는 꼭 필요한 기능을 강제화한다.
- 추상 클래스를 상속받고 있지만 오버라이딩하여 메소드를 구현할 수 없는 경우에는 해당 클래스 또한 추상 클래스로 만들어 주어야 한다.
- 추상의 경우 클래스 다이어그램에 나타낼 때 기울임 폰트로 나타낸다.
추상 메소드
- 몸체 없는 미완성된 메소드로 선언부에 abstract 키워드를 사용한다. 상속 시 반드시 구현해야 하기 때문에 오버라이딩이 강제화된다.
[접근제한자] abstract 반환형 메소드명(자료형 변수명); - 여기에서 언급되는 몸체란 메소드의 중괄호 부분을 말한다. 추상 메소드는 중괄호 부분이 존재하지 않는다.
인터페이스
- 추상 클래스보다 더 강력한 규약을 만들기 위해서 사용되며, 그렇기 때문에 인터페이스 내부에는 상수형 필드와 추상 메소드만 작성 가능하다.
- 메소드 통일성을 부여하기 위하여 추상 메소드만을 따로 모아 놓은 형태이다.
- 상속 시 인터페이스 내에 정의된 모든 추상 메소드를 구현하여야 한다.
[접근제한자] interface 인터페이스명 {
[public final static] 자료형 변수명 = 초기값;
[public abstract] 반환자료형 메소드명([자료형 매개변수]);
}
인터페이스 내부에는 상수형(public final static) 필드와 추상 메소드만 들어갈 수 있기 때문에 접근제한자와 키워드를 생략 가능하다.
생략이 가능하기 때문에 오버라이딩 시 반드시 public을 표기하여야 한다. - 인터페이스의 특징
- 모든 인터페이스의 메소드는 묵시적으로 public이고 abstract이다.
- 모든 인터페이스의 변수는 묵시적으로 public static final이기 때문에 인터페이스 변수의 값을 변경 시도하는 경우 에러가 발생한다.
- 인터페이스의 객체 생성은 불가능하나 참조형 변수로는 사용 가능하다.
- 인터페이스 간의 상속(extends를 사용한)이 가능하다.
- 인터페이스의 장점
- 상위 타입 역할로 다형성을 지원하여 연결한다.
- 해당 객체가 다양한 기능을 제공하여도 인터페이스에 해당하는 기능만을 사용하도록 제한이 가능하다.
- 공통 기능 상의 일관성을 제공한다
- 공통 작업을 위한 인터페이스를 제공한다.
- implements 키워드를 사용하여 오버라이딩한다.
- 인터페이스 내에는 일반 메소드가 존재하지 않기 때문에 다중 상속이 가능하다.
- Marker Interface: 내부에 선언된 메소드가 존재하지 않고 이름만 있는 인터페이스로, 메소드의 구현(완성)을 목적으로 하는 것이 아니라 클래스의 특성을 나타내기 위하여 사용한다.