상속 부모클래스에정의된필드와메소드를자식클래스가물려받는것 슈퍼클래스 (superclass) 특성을물려주는상위클래스 서브클래스 (subclass) 특성을물려받는하위클래스 슈퍼클래스에자신만의특성 ( 필드, 메소드 ) 추가 슈퍼클래스의특성 ( 메소드 ) 을수정 = 오버라이딩구체화 class Phone 전화걸기전화받기 class MobilePhone 전화걸기전화받기무선기지국연결배터리충전하기 class MusicPhone 전화걸기전화받기무선기지국연결배터리충전하기음악다운받기음악재생하기
중복된멤버 상속이없는경우중복된멤버를가진 4 개의클래스 상속을이용한경우중복이제거되고간결해진클래스구조
상속선언 public class Person{ public class Student extends Person{ public class StudentWorker extends Student{ 자바에서의상속특징 다중상속을지원하지않음 상속횟수는무제한 상속의최상위조상클래스는 java.lang.objetc 클래스 모든클래스는자동으로 java.lang.object 상속받음
서브클래스의객체와멤버접근 서브클래스의객체에는슈퍼클래스의멤버포함 슈퍼클래스의 private 멤버는상속되지않음 서브클래스에서직접접근불가 private 멤버는슈퍼클래스의메소드를통해접근!!!! 서브클래스객체에슈퍼클래스멤버가포함되므로슈퍼클래스멤버의접 근은서브클래스멤버접근과동일
public class MemberAccessExample{ public static void main(string[] args){ A a = new A(); B b = new B(); a.p = 5; a.n = 5; b.p = 5; b.n = 5; b.setn(10); int i = b.getn(); b.m = 20; b.setm(20); System.out.println(b.toString()); 10 20
default private protected public 같은패키지의클래스 O X O O 같은패키지의서브클래스 O X O O 다른패키지의클래스 X X X O 다른패키지의서브클래스 X X O O private 멤버 sup 의멤버가 private 지정되면 sub 는그멤버직접사용할수없다 protected 멤버 같은패키지에속한다른클래스접근허용 다른패키지여도상속받는 sub의접근을허용 public 멤버 sub 뿐만아니라어떤클래스에서도접근허용 ( 패키지가달라도접근가능 ) default 멤버 같은패키지에있는모든클래스접근허용
질문 1. 서브클래스의객체가생성될때서브클래스의생성자와슈퍼 클래스의생성자가모두실행되는가? 아니면서브클래스의생성 자만생성되는가? 둘다실행된다 질문 2. 서브클래스의객체가생성될때서브클래스의생성자와슈퍼 클래스의생성자의실행순서는어떻게되는가? 슈퍼클래스의생성자가먼저실행된후서브클래스의생성자가실행된다.
슈퍼클래스와서브클래스의생성자간의호출및실행관계 생성자 A 생성자 B 생성자 C
서브클래스와슈퍼클래스의생성자짝맞추기 서브클래스의생성자가기본생성자인경우, 컴파일러는자동으로슈퍼클래스의기본생성자와짝을맺음 컴파일러가 public B() 에대한짝을찾을수없음 생성자 A 생성자 B 컴파일러에의해 Implicit super constructor A() is undefined. Must explicitly invoke another constructor 오류발생
서브클래스에매개변수가있는생성자는슈퍼클래스의어떤생성자와짝을이루는가? 생성자 A 매개변수생성자 B
슈퍼클래스의매개변수가있는생성자는사용하지못하는가? super() 서브클래스에서명시적으로슈퍼클 래스의생성자를선택호출할때사용 사용방식 super(parameter); 인자를이용하여슈퍼클래스의적당한생성자호출반드시서브클래스의생성자코드의제일첫라인에와야함 (this() 와같음 )
매개변수생성자 A5 매개변수생성자 B5
1. 다음은서브클래스 B 의생성자코드이다. 잘못된부분은? public b(){ System.out.println( 생성자 B ); super(10); 2. 아래의코드를실행하였을때그결과는? class A{ public A(){ System.out.println( 생성자 ); public A(int x){ System.out.println( 매개변수생성자A +x); class B extends A{ public B(){ super(30); System.out.println( 생성자B ); public B(int x){ System.out.println( 매개변수생성자B ); public class ConstructorEx3{ public static void main(string[] args){ B b; b = new B();
SuperTest 클래스의속성정의 이름 : name 사는곳 : addr SubTest 클래스의속성정의 SuperTest 클래스로부터상속받는다. 나이 : age 점수 : score Main 메소드 출력물처럼나오도록작성하시오. 자세한문제는 07_before.hwp파일을확인하세요
업캐스팅 (upcasting) 프로그램에서이루어지는자동타입변환 서브클래스의객체가슈퍼클래스타입으로변환되는것 슈퍼클래스레퍼런스가서브클래스객체를가리키게되는현상 객체내에있는모든멤버를접근할수없고슈퍼클래스의멤버만접근가능 class Person { class Student extends Person { Student s = new Student(); Person p = s; // 업캐스팅, 자동타입변환
class Person { String name; String id; public Person(String name) { this.name = name; class Student extends Person { String grade; String department; public Student(String name) { super(name); public class UpcastingEx { public static void main(string[] args) { Person p; Student s = new Student( 이재문 ); p = s; // 업캐스팅발생 System.out.println(p.name); // 오류없음 p.grade = A ; // 컴파일오류 p.department = Com ; // 컴파일오류
메소드오버라이딩 (Method Oberriding) 이란? 슈퍼클래스의메소드를서브클래스에서재정의하는것 슈퍼클래스의메소드이름, 인자타입및개수, 리턴타입등모든것동일하게정의 동적바인딩발생 오버라이딩된메소드가무조건실행되도록동적바인딩됨
1. 반드시슈퍼클래스메소드와동일한이름, 동일한호출인자, 반환타입을가져야한다. 2. 오버라이딩된메소드의접근지정자는슈퍼클래스의메소드의접근지정자보다좁아질수없다. public > protected > private 순으로지정범위가좁아진다. 3. 반환타입만다르면오류 4. static, private, 또는 final 메소드는오버라이딩될수없다. class Person { String name; String phone; static int ID; public void setname(string s) { name = s; public String getphone() { return phone; public static int getid() { return ID; class Professor extends Person { protected void setname(string s) { // 2번조건위배 public String getphone() { return phone; public void getphone(){ // 3번조건위배 public int getid() // 4번조건위배
슈퍼클래스생성 DObjec클래스 기본생성자와 draw() 메소드생성 서브클래스생성 DObjec클래스를상속받는클래스 3개를생성한다. Line, Rect, Circle 클래스 각클래스는 draw() 메소드를가지고있다. 상속관계에있는클래스의메소드오버라이딩이일어남을확인할수있는문제이다. MethodOverring 클래스생성 Main 메소드 객체를생성하고, draw() 메소드를접근함으로써결과가어떻게나오는지확인한다.
public class SuperObject { protected String name; public void paint() { draw(); public void draw() { System.out.println( Super Object ); public static void main(string [] args) { SuperObject a = new SuperObject(); a.paint(); class SuperObject { protected String name; 동적바인딩 public void paint() { draw(); 동적바인딩 public void draw() { System.out.println( Super Object ); public class SubObject extends SuperObject { public void draw() { System.out.println( Sub Object ); public static void main(string [] args) { SuperObject b = new SubObject(); b.paint();
super. 슈퍼클래스의멤버 서브클래스에서슈퍼클래스의멤 버를접근할때사용되는슈퍼클래 스타입의레퍼런스 상속관계에있는서브클래스에서 만사용됨 오버라이딩된슈퍼클래스의메소 드호출시사용 Super Sub class SuperObject { protected String name; public void paint() { draw(); public void draw() { System.out.println(name); public class SubObject extends SuperObject { protected String name; public void draw() { name = "Sub"; super.name = "Super"; super.draw(); System.out.println(name); public static void main(string [] args) { SuperObject b = new SubObject(); b.paint();
다음은오버로딩인가, 오버라이딩인가, 컴파일오류인가? class A{ void f(int x){ class b extends A{ void f(char c){ 다음프로그램의실행결과화면에무엇이출력되는가? class SuperObject{ public void paint(){ draw(); public void draw(){ draw(); System.out.println( super object ); class SubObject extends SuperObject{ public void paint(){ super.draw(); public void draw(){ System.out.println( sub object ); public class Sample{ public static void main(string[] args){ SuperObject b = new SubObject(); b.paint();
비교요소메소드오버로딩메소드오버라이딩 정의 같은클래스나상속관계에서동일한이름의메소 드중복작성 서브클래스에서슈퍼클래스에있는메소드와동일 한이름의메소드재작성 관계동일한클래스내혹은상속관계상속관계 목적 이름이같은여러개의메소드를중복정의하여 사용의편리성을향상 슈퍼클래스에구현된메소드를무시하고서브클래 스에서새로운기능의메소드를재정의하고자함 조건 메소드이름은반드시동일함. 메소드의인자의 개수나인자의타입이달라야성립 메소드의이름, 인자의타입, 인자의개수, 인자의리 턴타입등이모두동일하여야성립 바인딩 정적바인딩. 컴파일시에중복된메소드중호출 되는메소드결정 동적바인딩. 실행시간에오버라이딩된메소드찾아 호출