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 |
Tags
- java
- 명품 자바 프로그래밍
- 파이썬
- Java11
- Python 3
- 기본
- 단계별로 풀어보기
- BOJ
- 기초100제
- JAVA 11
- SQLD / SQLP
- baekjoon
- 코딩테스트
- Codeforces Round #802 (Div. 2)
- 개념
- 자바
- Codeup
- HAVING 절
- Python
- 응용
- level1
- 공공데이터
- programmers
- 기초
- 헤드퍼스트 디자인패턴
- pypy3
- GROUP BY 절
- SELECT 절
- 이론
- 백준
Archives
- Today
- Total
Development Project
Chapter05 상속 본문
- 상속
- 부모클래스(상위클래스)에 만들어진 필드, 메소드를 자식클래스(하위클래스)가 물려받음
- 장점
- 클래스의 간결화
- 멤버의 중복 작성 불필요 - 클래스 관리 용이
- 클래스들의 계층적 분류 - 소프트웨어의 생산성 향상
- 클래스 재사용과 확장 용이
- 새로운 클래스의 작성 속도 빠름
- 클래스의 간결화
- 장점
- 클래스 상속과 객체
- 클래스 상속
- 부모클래스(슈퍼클래스)public class Person { ... } // Person을 상속받는 클래스 Student 선언 public class Student extends Person { ... } // Student를 상속받는 StudentWorker 선언 public class StudentWorker extends Student { ... }
- 자식클래스(서브클래스) == 슈퍼클래스를 확장 - 객체
public class Main { public static void main(String[] args) { Point p = new Point(); p.set(1, 2); p.showPoint(); ColorPoint cp = new ColorPoint(); cp.set(3, 4); cp.setColor("red"); cp.showColorPoint(); } } public class Point { int x; int y; void set(int x, int y){ this.x = x; this.y = y; } } public class ColorPoint extends Point { String color; void setColor(String color){ this.color = color; } void showColorPoint() { System.out.print(color); showPoint(); } }
- 자바 상속의 특징
- 클래스의 다중 상속을 지원하지 않음
- 상속 횟수는 무제한
- 클래스 상속
- 상속과 protected 접근 지정자
- 상속과 생성자
- 서브 클래스 / 슈퍼 클래스의 생성자 호출 및 실행
- new에 의해 서브 클래스의 객체가 생성될 때
- 슈퍼 클래스의 생성자와 서브 클래스 생성자 모두 실행됨
- 생성자 호출은 서브 클래스의 생성자를 먼저 호출 후, 컴파일러가 슈퍼 클래스의 생성자를 호출
- 생성자 실행은 슈퍼 클래스의 생성자가 먼저 실행된 후, 서브 클래스의 생성자 실행- 슈퍼 클래스와 서브 클래스의 생성자간의 호출 및 실행 관계
- 슈퍼 클래스와 서브 클래스의 생성자간의 호출 및 실행 관계
- 슈퍼 클래스 생성자와 서브 클래스 생성자
- 슈퍼 클래스의 기본 생성자가 자동 선택
=> 만약 클래스 A에 기본 생성자가 없다면, 컴파일러에 의해 “Implicit super constructor A() is undefined. Must explicitly invoke another constructor” 오류가 발생함 - 서브 클래스에 매개변수를 가진 생성자
- 슈퍼 클래스의 기본 생성자가 자동 선택
- new에 의해 서브 클래스의 객체가 생성될 때
- super( parameter );
- 서브 클래스에서 명시적으로 슈퍼 클래스의 생성자 선택 호출할 때 사용
- 반드시 서브 클래스 생성자 코드의 가장 첫번째 줄에 위치해야함
- 슈퍼 클래스의 생성자 중 parameter를 받을 수 있는 생성자가 호출됨
- 서브 클래스 / 슈퍼 클래스의 생성자 호출 및 실행
- 업캐스팅(upcasting)과 instanceof 연산자
- 업캐스팅 (upcasting) : 자동타입변환
- 서브 클래스 객체를 슈퍼 클래스 타입으로 타입 변환
class Person { ... } class Student extneds Person { ... } Student s = new Student(); Person p = s; // Upcasting : 객체 내에 슈퍼 클래스의 멤버만 접근 가능
- 다운캐스팅 (downcasting) : 강제타입변환
- 슈퍼 클래스 객체를 서브 클래스 타입으로 변환
class Person { ... } class Student extneds Person { ... } Person p = new Student("초코칩"); // Upcasting Student s = (Student)p; // Downcasting
- if) 실제 객체가 할당되지 않았다면 실행오류가 발생함
package inheritance.typecast; public class DownCasting { public static void main(String[] args){ Person she = new Person("초코칩", 1234568); System.out.println(she.name+" "+she.number); // Faculty f = she; // 컴파일 오류 // Faculty f1 = (Faculty) she; // 실행 오류 } }
- if) 실제 객체가 할당되지 않았다면 실행오류가 발생함
- instanceof 연산자
- 업캐스팅된 레퍼런스로 객체 타입을 판단할 수 없으므로, 레퍼런스가 가리키는 객체의 타입 식별을 위해 사용
객체레퍼런스 instanceof 클래스타입 // 결과 : true or false
- 업캐스팅 (upcasting) : 자동타입변환
- 메소드 오버라이딩 (Method Overriding) : @Override
- 메소드 오버라이딩
- 슈퍼 클래스의 메소드를 서브 클래스에서 재정의 (메소드이름, 매개변수 타입 및 개수, 리턴 타입 등 동일)
- ex) 같은 draw( ) 메소드라도 Line클래스는 선을 그리고, Circle클래스는 원을 그리고 싶을 때
- 동적 바인딩이 발생 : 서브 클래스에 오버라이딩된 메소드가 무조건 실행되는 동적 바인딩
- Binding : 함수를 호출할 때, 함수가 위치한 메모리 번지로 연결시키는 것
1. 정적 바인딩 : 컴파일 시간에 호출될 함수로 이동할 수 있는 주소가 결정되어 바인딩 ex) super( ) 사용시
2. 동적 바인딩 : 점프할 주소를 저장하기 위한 메모리 공간을 가지고 있다가 런타임시 결정
- Binding : 함수를 호출할 때, 함수가 위치한 메모리 번지로 연결시키는 것
- 메소드 오버라이딩 vs 오버로드
- 메소드 오버라이딩
- 추상 클래스
- 추상 메소드 ( abstract로 선언 )
- 선언되어 있으나, 구현되어있지 않은 메소드
- 추상 메소드는 서브 클래스에서 오버라이딩하여 구현해야 함public abstract String getName(); public abstract void setName(String s);
- 추상 클래스
- 개념
- 추상의 의미대로 "구체적"이지 않은 클래스 즉, 보다 구체적인 하위 클래스를 대표하는 클래스
- 사용 이유
- 서브 클래스마다 다른 구현이 필요한 메소드는 추상 메소드로 선언하고 슈퍼 클래스에서 개념을 정의함
- 각 서브 클래스에서 구체적 행위를 구현하기 위해, 서브 클래스 목적에 맞게 추상메소드도 다르게 구현함
- 계층적 상속 관계를 갖는 클래스 구조를 만들 때 - 생성 방법
- 추상 메소드를 하나라도 가진 클래스 (abstract 클래스로 선언 필수!)
abstract class Shape { public Shape() { } public void paint() { draw(); } abstract public void draw(); // 추상 메소드 }
- 추상 메소드가 없더라도 abstract로 선언된 클래스
abstract class MyComponent { String name; public void load(String name) { this.name = name; } }
- 추상 메소드를 하나라도 가진 클래스 (abstract 클래스로 선언 필수!)
- 추상 클래스의 상속
- 단순 상속
- 추상 클래스를 상속받고 추상 메소드를 구현하지 않으면 추상클래스가 됨
- 서브 클래스도 abstract로 선언해야함 - 구현 상속
- 서브 클래스에서 슈퍼 클래스의 추상 메소드 구현(오버라이딩)
- 서브 클래스 != 추상 클래스
- 단순 상속
- 다른 일반 클래스와 구별되는 특징
- 직접 객체화(instantiation)될 수 없음 == 생성자를 사용하여 객체를 생성할 수 없음
- 다른 클래스에 의하여 상속되어야 함 == 하위클래스가 없는 추상클래스는 의미가 없음
- 하위 클래스가 존재해야 하므로, 추상 클래스 구현 시 클래스 앞에 final 사용할 수 없음
- 개념
- 추상 메소드 ( abstract로 선언 )
- 인터페이스
- 인터페이스란?
- 스펙을 주어 클래스들이 그 기능을 서로 다르게 구현할 수 있도록 하는 클래스의 규격 선언
- 클래스의 다형성을 실현하는 도구
ex) 회사마다 구현방식은 다르지만 전기기기는 표준전압인 220V에 맞게 설계되어야 함 - 인터페이스 구현 예시
=> interface(PhoneInterface)를 선언하고, 새 클래스에서 PhoneInterface를 implements 키워드를 이용해 인터페이스의 추상 메소드를 모두 구현한 메소드를 작성할 수 있음 (메소드 추가 작성 가능)interface PhoneInterface { public static final int TIMEOUT = 10000; public abstract void sendCall(); public abstract void receiveCall(); public default void printLogo() { System.out.println("** PHONE **"); }; // 디폴트 메소드 } class SamsungPhone implements PhoneInterface { @Override public void sendCall() { System.out.println("띠리리리링"); } @Override public void receiveCall() { System.out.println("전화가 왔습니다"); } // 메소드 추가 작성 가능 public void flash() { System.out.println("전화기에 불이 켜졌습니다."); } } public class InterfaceEx { public static void main(String[] args){ SamsungPhone phone = new SamsungPhone(); phone.printLogo(); phone.sendCall(); phone.receiveCall(); phone.flash(); } }
- 자바 인터페이스 특징
- 인터페이스의 객체 생성 불가
new PhoneInterface(); // 오류
- 인터페이스 타입의 레퍼런스 변수 선언 가능
PhoneInterface galaxy;
- 인터페이스를 상속받는 클래스는 인터페이스 내의 모든 추상 메소드를 반드시 구현해야함
- 다른 인터페이스 상속 가능
- 인터페이스의 다중 상속 가능
- 클래스는 하나 이상의 인터페이스를 구현할 수 있음
class AIPhone implements MobilePhoneInterface, AIInterface { // MobilePhoneInterface의 모든 메소드를 구현 public void sendCall() { ... } public void receiveCall() { ... } public void sendSMS() { ... } public void receiveSMS() { ... } // AIInterface의 모든 메소드를 구현 public void recognizeSpeech() { ... } public void synthesizeSpeech() { ... } }
- 인터페이스의 객체 생성 불가
- 인터페이스란?
- 추가) 추상클래스 vs 인터페이스
- 유사점
- 객체를 생성할 수 없고, 상속을 위한 슈퍼 클래스로만 사용가능 - 다른점
- 유사점
'Language > Java' 카테고리의 다른 글
Chapter06 모듈과 패키지 개념, 자바 기본 패키지 (0) | 2021.12.28 |
---|---|
Chapter04 클래스와 객체 (0) | 2021.12.22 |
Chapter03 반복문과 배열 그리고 예외 처리 (0) | 2021.12.20 |
Chapter02 자바 기본 프로그래밍 (0) | 2021.12.20 |
Chapter01 자바시작 (0) | 2021.12.19 |
Comments