1. 상속
▷ 부모 클래스의 필드와 메소드를 자식 클래스에게 물려줄 수 있습니다.
◎ 상속의 이점
▷ 이미 개발된 클래스를 재사용하므로 중복 코드를 줄입니다.
▷ 클래스 수정을 최소화합니다.
2. 클래스 상속
▷ 자식 클래스를 선언할 때 어떤 부모로부터 상속받을 것인지를 결정하고, 부모 클래스를 다음과 같이 extends 뒤에 기술합니다.
▷ 다중 상속 허용하지 않습니다. extends 뒤에 하나의 부모 클래스만 상속합니다.
▶ 자바 외의 다른 언어에서는 다중 상속이 가능합니다.
▷ 클래스 앞에 final이 붙은 경우에는 상속이 불가능합니다.( ex) final calss Parent{ } )
▷ control + T를 누르면 상속이 나타납니다.
◎ 부모 클래스 Phone
// 부모 클래스 Phone public class Phone { public String model; public String color; public void bell() { System.out.println("벨이 울립니다."); } public void sendVoice(String message) { System.out.println("자기 : " + message); } public void receiveVoice(String message) { System.out.println("상대방 : " + message); } public void hangUp() { System.out.println("전화를 끊습니다."); } }
◎ 자식 클래스 SmartPhone
// 자식 클래스 SmartPhone public class SmartPhone extends Phone { public boolean wifi; public SmartPhone(String model, String color) { this.model = model; this.color = color; } public void setWifi(boolean wifi) { this.wifi = wifi; System.out.println("와이파이 상태를 변경했습니다."); } public void internet() { System.out.println("인터넷에 연결합니다."); } }
◎ SmartPhoneExample 클래스
public class SmartPhoneExample { public static void main(String[] args) { SmartPhone myPhone = new SmartPhone("갤럭시", "은색"); System.out.println("모델 : " + myPhone.model); System.out.println("색상 : " + myPhone.color); System.out.println("와이파이 상태 : " + myPhone.wifi); myPhone.bell(); myPhone.sendVoice("여보세요."); myPhone.receiveVoice("안녕하세요! 저는 홍길동인데요."); myPhone.sendVoice("아~ 네, 반갑습니다."); myPhone.hangUp(); myPhone.setWifi(true); myPhone.internet(); } } // 출력 : // 모델 : 갤럭시 // 색상 : 은색 // 와이파이 상태 : false // 벨이 울립니다. // 자기 : 여보세요. // 상대방 : 안녕하세요! 저는 홍길동인데요. // 자기 : 아~ 네, 반갑습니다. // 전화를 끊습니다. // 와이파이 상태를 변경했습니다. // 인터넷에 연결합니다.
◎ 상속을 이용한 추가 예제
// 클래스 사람 : 부모 클래스 class Person { void breath() { System.out.println("숨쉬기"); } void eat() { System.out.println("밥먹기"); } void say() { System.out.println("말하기"); } } // 클래스 학생 : 자식 클래스 class Students extends Person{ void learn() { System.out.println("배우기"); } } // 클래스 선생 : 자식 클래스 class Teacher extends Person{ void teach() { System.out.println("가르치기"); } } public class Inheritance1 { public static void main(String[] args) { Students s1 = new Students(); // 학생 객체 s1 생성 s1.breath(); // 학생 클래스에는 breath() 기능이 정의가 되어 있지 않습니다. // breath() <= Person 부모 클래스에 정의. // 상속을 통해 학생 클래스에서 부모가 가진 메소드 사용 가능 s1.learn(); Teacher t1 = new Teacher(); t1.eat(); t1.teach(); } } // 출력: // 숨쉬기 // 배우기 // 밥먹기 // 가르치기
3. 부모 생성자 호출
▷ 자식 객체를 생성하면 부모 객체가 먼저 생성된 다음에 자식 객체가 생성됩니다.
▷ 부모 생성자는 자식 생성자의 맨 첫 줄에 숨겨져 있는 super()에 의해 호출됩니다.
◎ Student 클래스
// 학생 : 부모 public class Student { // protected : 같은 클래스 내에서 사용, 자식 클래스에서 사용 가능 protected String name; protected int number; public Student() { name = ""; number = 0; } // 이름을 매개변수 값으로 초기화하면서 Student 객체를 생성합니다. public Student(String Name, int Number) { setName(Name); setNumber(Number); } public String getName() { return name; } public void setName(String Name) { this.name = Name; } public int getNumber() { return number; } public void setNumber(int Number) { this.number = Number; } public String toString() { return("이름 : " + name + ", 학번 : " + number); } // 현 객체의 현재 상태가 other 객체와 같은지를 알려준다. public boolean equals(Student other) { return (this.name.contentEquals(other.name)) && (this.number == other.number); } }
◎ Undergraduate 클래스
// 학부생 : 자식 public class Undergraduate extends Student { // 대학생의 소속 동아리명을 지정하는 객체 변수 private String clubName; // 학부생의 변수 값을 기본 값으로 초기화하면서 객체를 생성 public Undergraduate() { super(); // 부모 클래스의 생성자메소드를 호출 clubName = ""; } // 학부생의 변수들 값을 매개변수 값으로 초기화하면서 객체를 생성한다. public Undergraduate(String Name, int Number, String ClubName) { super(Name, Number); setClubName(ClubName); } public String getClubName() { return clubName; } public void setClubName(String clubName) { this.clubName = clubName; } // 현 객체의 현재 상태를 나타내는 문자열을 반환합니다. public String toString() { return super.toString() + ", 동아리 이름 : " + getClubName(); } // 현 객체의 현재 상태가 other 객체와 같은지를 알려준다. public boolean equals(Undergraduate other) { return (super.equals(other)) && (this.clubName.equals(other.clubName)); } }
◎ Driver 클래스
public class Driver { public static void main(String[] args) { // 학부생 객체 Undergraduate understu1 = new Undergraduate(); understu1.setName("선남"); understu1.setNumber(1601); understu1.setClubName("로봇"); System.out.println(understu1.toString()); Undergraduate understu2 = new Undergraduate("선녀", 1602, "독서"); System.out.println(understu2.toString()); if(understu1.equals(understu2)) { System.out.println("두 객체가 서로 같다."); } else { System.out.println("두 객체가 서로 다르다."); } } } // 출력 : // 이름 : 선남, 학번 : 1601, 동아리 이름 : 로봇 // 이름 : 선녀, 학번 : 1602, 동아리 이름 : 독서 // 두 객체가 서로 다르다.
4. 메소드 오버라이딩
▷ 상속된 메소드를 자식 클래스에서 재정의하는 것, 해당 부모 메소드는 숨겨지고, 자식 메소드가 우선적으로 사용됩니다.
▷ 부모 메소드의 선언부(리턴 타입, 메소드 이름, 매개변수)와 동일해야 합니다.
▷ 접근 제한을 더 강하게 오버라이딩할 수 없음(public → private으로 변경 불가)
▷ 새로운 예외를 throws 할 수 없습니다.
◎ Calculator 클래스
public class Calculator { public double areaCircle(double r) { System.out.println("Calculator 객체의 areaCircle() 실행"); return 3.14159 * r * r; } }
◎ Computer 클래스public class Computer extends Calculator{ //메소드 오버라이딩 // 컴파일시 정확히 오버라이딩이 되었는지 체크해줍니다.(생략가능) @Override public double areaCircle(double r) { System.out.println("Computer 객체의 areaCircle() 실행"); return Math.PI * r * r; } // 소스를 이용해서 부모 클래스에서 아래의 코드를 가져올 수 있습니다. // @Override // public double areaCircle(double r) { // // TODO Auto-generated method stub // return super.areaCircle(r); // } }
◎ ComputerExample 클래스public class ComputerExample { public static void main(String[] args) { int r = 10; Calculator calculator = new Calculator(); System.out.println("원 면적 : " + calculator.areaCircle(r)); System.out.println(); Computer computer = new Computer(); System.out.println("원 면적 : " + computer.areaCircle(r)); } } // 출력 : // Calculator 객체의 areaCircle() 실행 // 원 면적 : 314.159 // // Computer 객체의 areaCircle() 실행 // 원 면적 : 314.1592653589793
◎ 상속 예제
class Student2 { void learn() { System.out.println("배우기"); } void eat() { System.out.println("밥먹기"); } void say() { System.out.println("선생님 안녕하세요!"); } } class Leader extends Student2{ void lead() { } void say() { System.out.println("선생님께 인사"); } } public class Inheritance2 { public static void main(String[] args) { Leader leader1= new Leader(); leader1.eat(); leader1.say(); } } // 출력 : // 밥먹기 // 선생님께 인사
상속을 이용하면 부모에 있는 것을 자식에서 가져올 수 있습니다!!
부모에서는 자식 클래스를 사용할 수 없네요,,,
많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~

'BackEnd > Java' 카테고리의 다른 글
[java] 이것이 자바다 ch07 상속3 (0) | 2023.01.13 |
---|---|
[java] 이것이 자바다 ch07 상속2 (0) | 2023.01.13 |
[java] class (1) | 2023.01.12 |
[java] 이것이 자바다 ch06 singleton(싱글톤) 패턴 (1) | 2023.01.12 |
[java] 이것이 자바다 ch06 패키지 (0) | 2023.01.11 |