일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 닥스훈트
- 홀리스틱 유기농
- 반려견 사료등급
- 강아지 유기농
- 샤로수길 맛집
- 자동화봇
- 반려견 더위
- 강아지종류
- 쿠팡매크로
- 강아지 유기농 사료
- 반려견 유기농 사료
- 강아지 종류
- 반려견
- 강아지
- 반려견 유기농
- 신포동 맛집
- 강아지 열사병
- 반려견 열사병
- 티켓팅메크로
- 쿠팡메크로
- 티켓팅매크로
- 동인천 맛집
- 강아지 홀리스틱
- 강아지 더위
- 샤로수길 데이트
- 반려견 종류
- 서울대입구 맛집
- 반려견 홀리스틱
- 부산 맛집
- 국비지원 예습
- Today
- Total
심심한잉여의 잡동사니
JAVA - 다형성 본문
다형성
다형성은 객체지향 프로그래밍의 3대 특징 중 하나이다.
여러개의 형태를 가진다는 의미를 가진 다형성은
하나의 행동으로 여러 가지 일을 수행하는 개념
상속을 이용해 부모 타입으로부터 파생된 여러가지 타입의 자식 객체를
부모 클래스 타입 하나로 다룰 수 있는 기술
클래스 형변환
다운 캐스팅
자식 객체의 주소를 받은 부모 참조형 변수를 가지고 자식의 멤버를 참조해야 할 경우, 부모 클래스 타입의 참조형 변수를 자식 클래스 타입으로 형 변환하는 것
자동으로 처리되지 않기 때문에 반드시 후손 타입 명시해서 형 변환
Car c = new Sonate();
((sonata)c).moveSonata();
//클래스 간의 형 변환은 반드시 상속 관계에 있는 클래스끼리만 가능
해당 코드와 같이 사용을하기 위해서는 형변환이 필요.
부모클래스의 객체에 넣어 둘 순있지만 더 작은그릇으로 넘치고있는 자식객체만큼의 메모리를 사용하지 못하기 때문
대신 형변환을 통해 사용이 가능하다.
객체배열과 다형성
다형성을 이용하여 상속 관계에 있는 하나의 부모 클래스 타입의 배열 공간에 여러 종류의 자식 클래스 객체 저장 가능
Car[] carArr = new Car[5];
carArr[0] = new Sonata();
carArr[1] = new Avante();
carArr[2] = new Grandure();
carArr[3] = new Spark();
carArr[4] = new Morning();
위 코드와 같이 추상화한 Car라는 객체를 상속받은 자식클래스들은
Car라는 부모클래스의 객체로 통합하여 배열을 만들어 저장이 가능하다.
Instanceof 연산자
현재 참조형 변수가 어떤 클래스 형의 주소를 참조하고 있는지 확인 할 때 사용하는
연산자로 클래스 타입이 맞으면 true 맞지 않으면 false로 반환
객체를 확인하는 equals라고 생각하면 될 것 같다.
if(c instanceof Sonata){
((Sonata)c).moveSonata();
}else if(c instanceof Avante){
((Avante)c).moveAvante)
}
위 코드와 같이 형변환까지 사용하여 객체에 대한 제어문을 작성 할 수 있다.
c객체가 소나타 객체일 시 무브소나타 메소드 실행
c객체가 아반떼 객체일 시 무브아반떼 메소드 실행
바인딩
실제 실행할 메소드 코드와 호출하는 코드를 연결 시키는 것
프로그램이 실행되기 전 컴파일이 되면서 모든메소드는 정적 바인딩이 됨
- 동적 바인딩
컴파일 시 정적 바인딩이 된 메소드를
실행할 당시의 객체 타입을 기준으로 바인딩 되는 것
- 동적 바인딩 성립 조건
상속 관계로 이루어져 다형성이 적용된 경우, 메소드 오버라이딩이 되어 있으면 정적으로 바인딩 된 메소드 코드보다
오버라이딩 된 메소드 코드를 우선적으로 실행
추상 클래스
추상 클래스
몸체 없는 메소드를 포함한 클래스
추상 클래스일 경우 클래스 선언부에 abstract 키워드 사용
[접근 제한자] abstract class 클래스명 {}
추상 메소드
추상 메소드의 선언부에 abstract 키워드 사용
상속 시 반드시 구현해야 하는, 오버라이딩이 강제화되는 메소드
[접근제한자] abstract 반환형 메소드명(자료형 변수명);
특징
1. 미완성 클래스(abstract 키워드 사용) - 자체적으로 객체 생성 불가 반드시 상속하여 객체생성
2. abstract 메소드가 포함된 클래스는 반드시 abstract 클래스, abstract메소드가 없어도 선언가능
3. 클래스 내에 일반 변수, 메소드 포함 가능
4. 객체 생성은 안되지만 참조형 변수 타입으로는 사용가능
장점
일관된 인터페이스 제공
꼭 필요한 기능 강제화(공통적이나 자식클래스에서 특수화 되는 기능)
인터페이스
상수형 필드와 추상 메소드만을 작성할 수 있는 추상 클래스의 변형체 메소드
통일성을 부여하기 위해 추상 메소드만을 따로 모아놓은 것으로 상속 시
인터페이스 내에 정의된 모든 추상메소드를 구현해야 함
특징
1. 모든 인터페이스의 메소드는 묵시적으로 public이고 abstract
2. 변수는 묵시적으로 public static final, 따라서 인터페이스 변수의 값 변경 시도 시 에러 발생
3. 객체 생성은 안되나 참조형 변수로는 가능
장점
1. 상위 타입 역할로 다형성을 지원하여 연결
2. 해당 객체가 다양한 기능 제공 시에도 인터페이스에 해당하는 기능만을 사용하게 제한 가능
3. 공통 기능 상의 일관성 제공
4. 공동 작업을 위한 인터페이스 제공
추상 클래스와 인터페이스 차이점
실습 - 깃허브 : https://github.com/thyum3891/kh_java_study/commit/2f2199a6605ea86d52f6e995f9294f830163d49c
마치며
현재 인터페이스가 좀 어렵게 느껴지고있다.
아직 완전히 익숙하지 않은 상태에서 빠른 진도로 인해 그런 것 같은 느낌이 든다.
이번주동안 최대한 복습을 하면서 익숙해져야겠다고 판단을 했으며 주말까지 공부해야겠다.
'코딩일기 > Java' 카테고리의 다른 글
JAVA - 예외처리, 제네릭, 컬렉션 (0) | 2021.08.30 |
---|---|
JAVA - 기본 API (0) | 2021.08.29 |
JAVA - OOP 상속 (0) | 2021.08.22 |
JAVA - 객체 배열 (0) | 2021.08.20 |
JAVA - OOP 객체 지향 프로그래밍 (0) | 2021.08.18 |