JAVA/Java 기초

상속.java

john_ 2023. 1. 12. 12:13
728x90

2023.01.11 - [JAVA/Java 기초] - 싱글톤 패턴.java

 

싱글톤 패턴.java

2023.01.11 - [JAVA/Java 기초] - Getter & Setter .java Getter & Setter .java 2023.01.11 - [JAVA/Java 기초] - 패키지.java 패키지.java 2023.01.11 - [JAVA/Java 기초] - 인스턴스 멤버, static, final ... 인스턴스 멤버, static, final ... 20

less-go.tistory.com

 


 

상속이란?

부모 클래스의 필드와 메소드를 자식 클래스에게 물려줄 수 있습니다.


상속의 이점

  • 이미 개발된 클래스를 재사용 하므로 중복 코드를 줄입니다.
  • 클래스 수정을 최소화 합니다.

 

클래스 상속

  • 자식클래스를 선언 할때 어떤 부모로부터 상속받을것인지 결정하고, 부모클래스를 다음과 같이 extends 뒤에 기술합니다.
public class 자식클래스 extends 부모클래스 {
}
  • 다중 상속 허용하지않습니다. extends 뒤에 하나의 부모 클래스만 상속합니다.

부모클래스 두개 이상으로부터 상속을 받을수 없습니다.

 

예제로, phone 클래스를 상속받는 Smartphone을 이용해 메인메소드를 실행 시켜보겠습니다.

//부모클래스 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 recivevoice(String message) {
		System.out.println("상대방 : " + message);
	}
	
	public void hangUp() {
		System.out.println("전화를 끊습니다.");
	}
}
//자식 클래스 : 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("인터넷에 연결합니다.");
	}
}
//실행 메소드
public class SmartPhoneExam {

	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.recivevoice("안녕하세요! 저는 홍길동입니다.");
		myPhone.sendVoice("아~네, 반갑습니다.");
		myPhone.hangUp();
		
		myPhone.setWifi(true);
		myPhone.internet();
	}
}

 

//부모 클래스 : 사람
class Person{
	void breath() {
		System.out.println("숨쉬기");
	}
	void eat() {
		System.out.println("먹기");
	}
	void say() {
		System.out.println("말하기");
	}
}

//클래스 학생 : 자식 클래스
class Student extends Person{	//상속시에는 반드시 부모 클래스는 하나만 지정 가능
	void learn() {
		System.out.println("배우기");
	}
}

//클래스 선생 : 자식 클래스
class Teacher extends Person{
	void teach() {
		System.out.println("가르치기");
	}
}

public class Inheritance1 extends Student{

	public static void main(String[] args) {

		Student s1 = new Student();	// 학생 객체 s1 생성
		
		s1.breath();				// 학생 클래스에는 breath() 기능이 정의 되어 있지 않습니다.
									// breath()는 class student의 부모클래스인 class Person에서 정의
		s1.learn();
		
		Teacher t1 = new Teacher();
		t1.eat();					// eat()은 부모가 가진 메서드
		t1.teach();					// teach() Teacher 클래스 정의된 메서드
	}
}

 

세번째 예제를 들어보겠습니다.

해당 예제에서는 get, set, contentEquals(), super 가 나옵니다.

contentEquals()와 equals()는 문자열비교의 기능적으로는 큰 차이가 없으나,
자료형이 다를때 사용되는 폭이 contentEquals()가 좀더 넓습니다.
// 부모클래스 : Student
public class Student {
	
	protected String name;
	protected int number;
	
	public Student(){
		name = "";
		number = 0;
	}
	// 이름을 매개변수 값으로 초기화 하면서 Student 객체를 생성합니다.
	public Student(String Name, int Number) {
		setName(Name);	// setName 메소드를 입력받은 매개변수 Name으로 실행시켜줍니다.		--1
		setNumber(Number);	// setNumber 메소드를 입력받은 매개변수 Number로 실행시켜줍니다.	--1
	}
	
	public String getName() {
		return name;
	}
	
	public int getNumber() {
		return number;
	}
	
	public void setName(String name) {
		this.name = name;		// 입력받은 Name으로 setName 메소드 실행후 Student의 name 필드값을 위에서 입력받은 Name으로 변경해줍니다. --2
	}
	
	public void setNumber(int Number) {
		this.number = Number;	// 입력받은 Number로 setNumber 메소드 실행후 Student의 number 필드값을 위에서 입력받은 Number로 변경합니다 --2
	}
	
	public String toString() {
		return ("이름: " + name + ", " + "학번 : " + number);
	}
	
	//현 객체의 현재 상태가 other 객체와 같은지 알려줍니다.
	public boolean equals(Student other) {
		return(this.name.equals(other.name))&&(this.number == other.number);
	}
}
// 자식클래스 : Undergradute
public class Undergradute extends Student{
	
	//대학생의 소속 동아리명을 지정하는 객체변수
	private String clubName;
	
	//학부생의 변수 값을 기본값으로 초기화 하면서 객체를 생성
	public Undergradute() {
		super();	// 부모 클래스의 생성자 메소드를 호출
		clubName = "";
	}
	
	// 학부생의 변수들 값을 매개변수 값으로 초기화하면서 객체를 생성합니다.
	public Undergradute(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(Undergradute other) {
		return(super.equals(other)) && (this.clubName.equals(other.clubName));
	}
}
// 실행 메소드
public class Driver {

	public static void main(String[] args) {

		Undergradute understu1 = new Undergradute();
		
		understu1.setName("선남");
		understu1.setNumber(1601);
		understu1.setClubName("로봇");
		
		System.out.println(understu1.toString());
		
		Undergradute understu2 = new Undergradute("선녀", 1602, "독서");
		
		System.out.println(understu2.toString());
		
		if (understu1.equals(understu2)) {
			System.out.println("두 객체가 서로 같다.");
		}else {
			System.out.println("두 객체가 서로 다르다.");
		}
	}
}
결과:
이름: 선남, 학번 : 1601, 동아리 이름: 로봇
이름: 선녀, 학번 : 1602, 동아리 이름: 독서
두 객체가 서로 다르다.

 


자바에서 상속이 가능하지 않은 경우

클래스 앞에 final 이 붙은 경우 상속이 불가능 합니다.

 

tip ) Ctrl + t 를 입력하면 상속관계를 확인할수 있습니다.

 


 

728x90

'JAVA > Java 기초' 카테고리의 다른 글

오버라이딩(overriding).java  (0) 2023.01.12
클래스와 인스턴스 등...(리마인드용)  (0) 2023.01.12
static 이란?  (0) 2023.01.11
싱글톤 패턴.java  (0) 2023.01.11
Getter & Setter .java  (0) 2023.01.11