본문 바로가기

BackEnd/Java

[java] 이것이 자바다 ch07 상속

728x90
반응형

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();
	}
}

//	출력 : 
//	밥먹기
//	선생님께 인사

 

상속을 이용하면 부모에 있는 것을 자식에서 가져올 수 있습니다!!

 

부모에서는 자식 클래스를 사용할 수 없네요,,,

 

많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~

 

728x90
반응형