TIL(Today I Learned)_230727

Aspyn ChoiΒ·2023λ…„ 7μ›” 27일
0

TIL

λͺ©λ‘ 보기
12/37

☝🏻였늘 배운 것

1. 상속

- μƒμ†μ΄λž€?

: λ‹€λ₯Έ 클래슀(λΆ€λͺ¨ν΄λž˜μŠ€)κ°€ 가지고 μžˆλŠ” 멀버(ν•„λ“œ, λ©”μ†Œλ“œ)듀을 μƒˆλ‘œ μž‘μ„±ν•  클래슀(μžμ‹ 클래슀)μ—μ„œ 직접 λ§Œλ“€μ§€ μ•Šκ³  상속을 λ°›μŒμœΌλ‘œμ¨ μƒˆ ν΄λž˜μŠ€κ°€ μžμ‹ μ˜ λ©€λ²„μ²˜λŸΌ μ‚¬μš©ν•  수 μžˆλŠ” κΈ°λŠ₯
-> λΆ€λͺ¨ 객체λ₯Ό μžμ‹ 객체 μ•ˆμ— μƒμ„±ν•˜μ—¬ μžμ‹κ°μ²΄λ₯Ό λΆ€λͺ¨κ°μ²΄λ₯Ό μžμ‹  것 처럼 μ‚¬μš©ν•  수 μžˆλ‹€.

- μƒμ†μ˜ λͺ©μ κ³Ό μž₯점

  1. λͺ©μ  :
    클래슀의 μž¬μ‚¬μš©, μ—°κ΄€λœ 일련의 ν΄λž˜μŠ€λ“€μ— λŒ€ν•œ 곡톡적인 κ·œμ•½ μ •μ˜(μ˜€λ²„λΌμ΄λ”©)

  2. μž₯점 :
    1) 보닀 적은 μ–‘μ˜ μ½”λ“œλ‘œ μƒˆλ‘œμš΄ 클래슀 μž‘μ„± κ°€λŠ₯
    2) μ½”λ“œλ₯Ό κ³΅ν†΅μ μœΌλ‘œ κ΄€λ¦¬ν•˜κΈ° λ•Œλ¬Έμ— μ½”λ“œμ˜ μΆ”κ°€ 및 λ³€κ²½ 용이
    3) μ½”λ“œμ˜ 쀑볡을 μ œκ±°ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ˜ 생산성과 μœ μ§€λ³΄μˆ˜μ— 크게 κΈ°μ—¬

- μƒμ†μ˜ 방법

  1. 클래슀 κ°„μ˜ 상속 μ‹œμ—λŠ” extends ν‚€μ›Œλ“œ μ‚¬μš©
  2. ν‘œν˜„μ‹ :
  • [μ ‘κ·Όμ œν•œμž] class μžμ‹ 클래슀λͺ… extends λΆ€λͺ¨ 클래슀λͺ… { }
  • public class Academy extends Company { }

- μƒμ†μ˜ νŠΉμ§•

  1. λͺ¨λ“  ν΄λž˜μŠ€λŠ” Object클래슀의 후손이닀.
    Objectν΄λž˜μŠ€κ°€ μ œκ³΅ν•˜λŠ” λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•˜μ—¬ λ©”μ†Œλ“œμ˜ μž¬κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.
    ex) java.lang.String 클래슀의 equals()와 toString()..

  2. λΆ€λͺ¨ν΄λž˜μŠ€μ˜ μƒμ„±μž, μ΄ˆκΈ°ν™” 블둝은 상속 μ•ˆ 됨
    μžμ‹ 클래슀 생성 μ‹œ, λΆ€λͺ¨ 클래슀 μƒμ„±μžκ°€ λ¨Όμ € μ‹€ν–‰λœλ‹€.
    λ§Œμ•½ μžμ‹ 클래슀 μƒμ„±μž μ•ˆμ—μ„œ λΆ€λͺ¨ 클래슀 μƒμ„±μž ν˜ΈμΆœμ„ λͺ…μ‹œν•˜κ³  μ‹ΆμœΌλ©΄ super() ν™œμš©ν•΄μ•Όν•œλ‹€.

  3. λΆ€λͺ¨μ˜ privateλ©€λ²„λŠ” 상속은 λ˜μ§€λ§Œ 직접은 μ ‘κ·Ό λΆˆκ°€ν•˜λ‹€.
    μžμ‹ 객체 생성 μ‹œμ— λΆ€λͺ¨μ˜ ν•„λ“œ 값도 전달 받은 경우,
    μžμ‹ μƒμ„±μž μ•ˆμ—μ„œ λΆ€λͺ¨μ˜ private ν•„λ“œμ— 직접 μ ‘κ·Όν•˜μ—¬ λŒ€μž… λΆˆκ°€ν•œλ°, 이럴 κ²½μš°μ—λŠ”
    1) super() μ΄μš©ν•˜μ—¬ 전달받은 λΆ€λͺ¨ ν•„λ“œ 값을 λΆ€λͺ¨ μƒμ„±μž μͺ½μœΌλ‘œ λ„˜κ²¨μ„œ μƒμ„±ν•˜κ±°λ‚˜
    2) setter, getter λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ 접근해야함.

- super() μƒμ„±μž

: λΆ€λͺ¨ 객체의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λŠ” λ©”μ†Œλ“œμ΄λ‹€.
: 후손 클래슀 μƒμ„±μž μ•ˆμ—λŠ” λΆ€λͺ¨ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λŠ” super()κ°€ 첫 쀄에 μ‘΄μž¬ν•΄μ•Όν•œλ‹€. (λΆ€λͺ¨ μƒμ„±μžκ°€ κ°€μž₯ λ¨Όμ € μ‹€ν–‰λ˜μ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— λͺ…μ‹œμ μœΌλ‘œ μž‘μ„± μ‹œμ—λ„ λ°˜λ“œμ‹œ 첫 μ€„μ—λ§Œ μž‘μ„±)
: λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” λΆ€λͺ¨ μƒμ„±μž ν˜ΈμΆœμ€ super(λ§€κ°œλ³€μˆ˜, λ§€κ°œλ³€μˆ˜...)λ₯Ό λ„£μœΌλ©΄ 됨

- super. μ°Έμ‘° λ³€μˆ˜

: 상속을 ν†΅ν•œ μžμ‹ 클래슀 μ •μ˜ μ‹œ ν•΄λ‹Ή μžμ‹ 클래슀의 λΆ€λͺ¨ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” μ°Έμ‘°λ³€μˆ˜
μžμ‹ 클래슀 λ‚΄μ—μ„œ λΆ€λͺ¨ 클래슀 객체에 μ ‘κ·Όν•˜μ—¬ ν•„λ“œλ‚˜ λ©”μ†Œλ“œ 호좜 μ‹œ μ‚¬μš©

2. μ˜€λ²„λΌμ΄λ”©(Overriding)

- μ˜€λ²„λΌμ΄λ”©μ΄λž€?

: over - μœ„/μƒμœ„ λΌλŠ” λœ»λ„ 있음 -> overriding은 μœ„μ— μ˜¬λΌνƒ”λ‹€λΌκ³  μƒκ°ν•˜κΈ°
: μžμ‹ ν΄λž˜μŠ€κ°€ 상속 받은 λΆ€λͺ¨ λ©”μ†Œλ“œλ₯Ό μž¬μž‘μ„± ν•˜λŠ” 것(μž¬μ •μ˜)
: λΆ€λͺ¨κ°€ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯을 후손이 일뢀 고쳐 μ‚¬μš©ν•˜κ² λ‹€λŠ” 의미둜 μžμ‹ 객체λ₯Ό ν†΅ν•œ μ‹€ν–‰ μ‹œ 후손 것이 μš°μ„ κΆŒμ„ 가짐

- μ˜€λ²„λΌμ΄λ”© νŠΉμ§•

  1. λ©”μ†Œλ“œ ν—€λ“œλΌμΈ μœ„μ— λ°˜λ“œμ‹œ Annotation(주석), @Overrideλ₯Ό ν‘œμ‹œν•΄μ•Όν•¨
    : @Override μ–΄λ…Έν…Œμ΄μ…˜ -> ν•΄λ‹Ή λ©”μ†Œλ“œκ°€ μ˜€λ²„λΌμ΄λ”© λ˜μ—ˆμŒμ„ μ»΄νŒŒμΌλŸ¬μ—κ²Œ μ•Œλ €μ£ΌλŠ” 역할을 ν•˜λ©° μ»΄νŒŒμΌλŸ¬μ—κ²Œ 문법 체크λ₯Ό ν•˜λ„λ‘ μ•Œλ¦°λ‹€.
    : μ–΄λ…Έν…Œμ΄μ…˜(Annotation) -> μ»΄νŒŒμΌλŸ¬μ—κ²Œ μ•Œλ €μ£ΌκΈ° μœ„ν•œ μ½”λ“œ(컴파일러 μΈμ‹μš© 주석)
  2. μ ‘κ·Ό μ œμ–΄μžλ₯Ό λΆ€λͺ¨ 것보닀 κ°™κ±°λ‚˜ 넓은 λ²”μœ„λ‘œ λ³€κ²½ κ°€λŠ₯
  3. λΆ€λͺ¨ λ©”μ†Œλ“œμ˜ μ˜ˆμ™Έμ²˜λ¦¬ 클래슀 μ²˜λ¦¬λ²”μœ„λ³΄λ‹€ 쒁은 λ²”μœ„λ‘œ μ˜ˆμ™Έμ²˜λ¦¬ 클래슀 μˆ˜μ • κ°€λŠ₯

- 성립 쑰건

: λ©”μ†Œλ“œ 이름이 동일해야함
: λ§€κ°œλ³€μˆ˜μ˜ 개수, νƒ€μž…, μˆœμ„œ λͺ¨λ‘ 동일해야함
: 리턴 νƒ€μž…μ΄ 동일해야함
: πŸ“Œprivate λ©”μ†Œλ“œλŠ” μ˜€λ²„λΌμ΄λ”© λΆˆκ°€ν•¨.

- μ˜€λ²„λΌμ΄λ”©/ μ˜€λ²„λ‘œλ”© 비ꡐ

- 상속 예제

βœ… Person 클래슀(λΆ€λͺ¨ 클래슀)

package edu.kh.inheritance.model.vo;

public class Person {
	
	// ν•„λ“œ
	private String name; // 이름 
	private int age; // λ‚˜μ΄
	private String nationality; // ꡭ적
	
	// μƒμ„±μž
	public Person() {} // κΈ°λ³Έμƒμ„±μž
	
	public Person(String name, int age, String nationality) { // λ§€κ°œλ³€μˆ˜ μƒμ„±μž -> μ˜€λ²„λ‘œλ”©
		this.name = name;
		this.age = age;
		this.nationality = nationality;
	}
	
	// λ©”μ„œλ“œ(getter/setter)

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getNationality() {
		return nationality;
	}

	public void setNationality(String nationality) {
		this.nationality = nationality;
	}
	
	public void breath() {
		System.out.println("μ‚¬λžŒμ€ μ½”λ‚˜ μž…μœΌλ‘œ μˆ¨μ„ μ‰°λ‹€");
		
	}
	
	public void move() {
		System.out.println("μ‚¬λžŒμ€ 움직일 수 μžˆλ‹€.");
	}

	@Override
	public String toString() {
		return name + "/" + age + "/" + nationality;
	}
	
}

βœ… Student 클래슀(μžμ‹ 클래슀)

package edu.kh.inheritance.model.vo;

public class Student extends Person {
	// Student ν΄λž˜μŠ€μ— Person 클래슀의 λ‚΄μš©μ„ μ—°μž₯ν•œλ‹€.
	// Student ν΄λž˜μŠ€μ— Person 클래슀의 λ‚΄μš©(ν•„λ“œ, λ©”μ„œλ“œ)을 μΆ”κ°€ν•˜μ—¬ ν™•μž₯ν•œλ‹€.
	
	// ***상솑***
	// extends : ν™•μž₯ν•˜λ‹€, μ—°μž₯ν•˜λ‹€...
	
//	private String name;
//	private int age;
//	private String nationality;
	private int grade; // ν•™λ…„
	private int classRoom; // 반
	
	
	public Student() {
		
		// Student() 객체 생성 μ‹œ 
		// 내뢀에 상속받은 Person 객체λ₯Ό μƒμ„±ν•˜κΈ°μœ„ν•œ
		// Person μƒμ„±μž 호좜 μ½”λ“œ ν•„μš”ν•˜λ‹€!
		
		// super : μƒμœ„
		// ν˜„μž¬ Student의 suepr == Person
		super(); // super() μƒμ„±μž
		// λΆ€λͺ¨μ˜ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λŠ” μ½”λ“œλ‘œ
		// λ°˜λ“œμ‹œ μžμ‹μ˜ μƒμ„±μž μ΅œμƒλ‹¨μ— μž‘μ„±λ˜μ–΄μ•Όν•œλ‹€.
		// λΆ€λͺ¨μ˜ μƒμ„±μž μ‹€ν–‰(ν•„λ“œ μ΄ˆκΈ°ν™”+νŠΉμ •κΈ°λŠ” μˆ˜ν–‰)
		
		// * super() μƒμ„±μž 떄문에
		// μžμ‹ 객체 내뢀에 λΆ€λͺ¨κ°μ²΄κ°€ μƒμ„±λœλ‹€!
		
		// * super() μƒμ„±μž λ―Έμž‘μ„±μ‹œ
		// μ»΄νŒŒμΌλŸ¬κ°€ 컴파일 λ‹¨κ³„μ—μ„œ μžλ™μœΌλ‘œ μΆ”κ°€ν•΄μ€Œ.
	
	}
	
	
	public Student(String name, int age, String nationality, int grade, int classRoom) {
//		this.name = name;
//		this.age = age;
//		this.nationality = nationality;
		// μ™œ? λΆ€λͺ¨μ˜ ν•„λ“œμ— private μ ‘κ·Όμ œν•œμžκ°€ μžˆμ–΄μ„œ
		// 아무리 물렀받은 μžμ‹μ΄λΌλ„ λ‹€λ₯Έ 객체이기 λ•Œλ¬Έμ— 직접접근 λΆˆκ°€
		
		// λΆ€λͺ¨μ˜ setterλ₯Ό μ΄μš©ν•  수 μžˆμ§€λ§Œ λͺ¨λ‘ μž‘μ„±ν•˜κΈ°μ—λŠ” λΉ„νš¨μœ¨μ μ΄λ‹€.
		
		super(name, age, nationality); // λΆ€λͺ¨μ˜ λ§€κ°œλ³€μˆ˜ μƒμ„±μž 호좜
		
		this.grade = grade;
		this.classRoom = classRoom;
	}

	
//	public String getName() {
//		return name;
//	}
//
//	public void setName(String name) {
//		this.name = name;
//	}
//
//	public int getAge() {
//		return age;
//	}
//
//	public void setAge(int age) {
//		this.age = age;
//	}
//
//	public String getNationality() {
//		return nationality;
//	}
//
//	public void setNationality(String nationality) {
//		this.nationality = nationality;
//	}

	public int getGrade() {
		return grade;
	}

	public void setGrade(int grade) {
		this.grade = grade;
	}

	public int getClassRoom() {
		return classRoom;
	}

	public void setClassRoom(int classRoom) {
		this.classRoom = classRoom;
	}
	
	@Override
	public String toString() {
		return super.toString() + "/" + grade + "/" + classRoom;
	}
}

βœ… Employee 클래슀(μžμ‹ 클래슀)

package edu.kh.inheritance.model.vo;

public class Employee extends Person{
	
//	private String name;
//	private int age;
//	private int nationality;
	private String company;
	
	
	public Employee() {}
	
	public Employee(String name, int age, String nationality, String company) {
//		this.name = name;
//		this.age = age;
//		this.nationality = nationality;
		this.company = company;
	}
	

//	public String getName() {
//		return name;
//	}
//
//	public void setName(String name) {
//		this.name = name;
//	}
//
//	public int getAge() {
//		return age;
//	}
//
//	public void setAge(int age) {
//		this.age = age;
//	}
//
//	public String getNationality() {
//		return nationality;
//	}
//
//	public void setNationality(String nationality) {
//		this.nationality = nationality;
//	}

	public String getCompany() {
		return company;
	}

	public void setCompany(String company) {
		this.company = company;
	}
	
	// Person으둜 λΆ€ν„° 상속받은 λ©”μ„œλ“œ 쀑 
	// move() λ©”μ„œλ“œλ₯Ό Employee에 맞게 μž¬μ •μ˜(==μ˜€λ²„λΌμ΄λ”©)
	
	//@Override μ–΄λ…Έν…Œμ΄μ…˜ : ν•΄λ‹Ή λ©”μ†Œλ“œκ°€ μ˜€λ²„λΌμ΄λ”© λ˜μ—ˆμŒμ„ μ»΄νŒŒμΌλŸ¬μ—κ²Œ μ•Œλ €μ£ΌλŠ” μ—­ν• 
							// -> μ»΄νŒŒμΌλŸ¬μ—κ²Œ 문법 체크λ₯Ό ν•˜λ„λ‘ μ•Œλ¦°λ‹€.
	// μ–΄λ…Έν…Œμ΄μ…˜(Annotation) : μ»΄νŒŒμΌλŸ¬μ—κ²Œ μ•Œλ €μ£ΌκΈ° μœ„ν•œ μ½”λ“œ(컴파일러 μΈμ‹μš© 주석)
	
	@Override
	public void move(){
		
		System.out.println("μ˜€λ²„λΌμ΄λ”© 된 move()");
		System.out.println("효율적으둜 빨리 μΌν•˜κ³  움직인닀.");
		
	}
	
	@Override
	public String toString() {
		return super.toString() + "/" + company;
	}
}

βœ… InheritanceService 클래슀(μ‹€ν–‰ν΄λž˜μŠ€)

package edu.kh.inheritance.model.service;

import java.util.Scanner;

import edu.kh.inheritance.model.vo.Employee;
import edu.kh.inheritance.model.vo.Person;
import edu.kh.inheritance.model.vo.Student;

public class InheritanceService {
	
	public void ex1() { // 상속 확인 예제
		// Person을 상속받은 Studentκ°€ Person의 ν•„λ“œ, λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλŠ”κ°€?
		
		
		Person p = new Person();
		
		//p.name = "홍길동"; // private λ•Œλ¬Έμ— 직접 μ ‘κ·Ό λΆˆκ°€(μ—λŸ¬λ°œμƒ) -> getter setter μ‚¬μš©ν•΄μ•Όν•¨
		p.setName("홍길동");
		p.setAge(25);
		p.setNationality("λŒ€ν•œλ―Όκ΅­");
		
		System.out.println(p.getName());
		System.out.println(p.getAge());
		System.out.println(p.getNationality());
		
		System.out.println("==============================");
		
		// Student 객체 생성
		Student std = new Student();
		
		// Student만의 고유 ν•„λ“œ
		std.setGrade(3);
		std.setClassRoom(5);
		// Person ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받은 ν•„λ“œ, λ©”μ„œλ“œ
		std.setName("고길동");
		std.setAge(19);
		std.setNationality("λŒ€ν•œλ―Όκ΅­");
		
		System.out.println(std.getGrade());
		System.out.println(std.getClassRoom());
		
		// Studentκ°€ Person의 λ©”μ†Œλ“œ 뿐 μ•„λ‹ˆλΌ ν•„λ“œλ„ 상속 λ°›μ•˜λŠ”μ§€ 확인
		System.out.println(std.getName());
		System.out.println(std.getAge());
		System.out.println(std.getNationality());
		
		System.out.println("==============================");
		
		Employee emp = new Employee();
		
		emp.setCompany("khμ •λ³΄κ΅μœ‘μ›");
		
		// Personν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받은 λ©”μ„œλ“œ 
		emp.setName("μ΅œμ§€μ€");
		emp.setAge(30);
		emp.setNationality("λŒ€ν•œλ―Όκ΅­");
		
		System.out.println(emp.getCompany());
		System.out.println(emp.getName());
		System.out.println(emp.getAge());
		System.out.println(emp.getNationality());
		
		// μΆ”κ°€λœ breathλ©”μ„œλ“œ 상속 ν™•μΈν•˜κΈ°
		p.breath();
		std.breath();
		emp.breath();
		// μƒμ†μ˜ νŠΉμ§• : μ½”λ“œ μΆ”κ°€ 및 μˆ˜μ •μ— μš©μ΄ν•¨
		// -> λΆ€λͺ¨μ—κ²Œ μ •μ˜ν•˜λ©΄ 상속받은 μžμ‹λ“€μ€ λͺ¨λ‘ λΆ€λͺ¨μ˜ 것을 κ·ΈλŒ€λ‘œ λ°›μ•„μ„œ μ“Έ 수 있음
	}
	
	// super() μƒμ„±μž μ‚¬μš© 방법
	public void ex2() {
		
		// Student λ§€κ°œλ³€μˆ˜ 5개짜리 μƒμ„±μž
		Student std = new Student("κΉ€μ² μˆ˜", 17, "ν•œκ΅­", 1, 3);
		
		System.out.println(std.getName());
		System.out.println(std.getAge());
		System.out.println(std.getNationality());
		
		System.out.println(std.getGrade());
		System.out.println(std.getClassRoom());
		
	}
	
	public void ex3() { // μ˜€λ²„λΌμ΄λ”© 확인 예제
		
		Student std = new Student();
		Employee emp = new Employee();
		
		std.move(); // μ˜€λ²„λΌμ΄λ”©x -> Person의 λ©”μ†Œλ“œ μˆ˜ν–‰
		emp.move(); // μ˜€λ²„λΌμ΄λ”©γ…‡ -> Employee의 λ©”μ†Œλ“œ μˆ˜ν–‰
	
	}
	
	public void ex4() {
		// λͺ¨λ“  ν΄λž˜μŠ€λŠ” Object 클래슀의 후손
		// == λͺ¨λ“  클래슀의 μ΅œμƒμœ„ λΆ€λͺ¨λŠ” Object
		
		// classλͺ…에 Objectμ—λŒ€ν•œ 상속ꡬ문이 μ—†λ‹€λ©΄ μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ extends Objectꡬ문을 μΆ”κ°€ν•΄μ€Œ
		
		Person p = new Person();
		// Object λ₯Ό 상속받은 Person 객체 생성
		
		Student std = new Student();
		// Person을 상속받은 Student 객체 생성
		
		// Object - Person - Student 
		
		System.out.println(p.hashCode());
		System.out.println(std.hashCode());
		// Person이 Objectμ—μ„œ 물렀받은 hashCode()λ₯Ό Studentκ°€ 또 λ¬Όλ €λ°›μ•„ μ‚¬μš©
		
		String str = "abc";
		Scanner sc = new Scanner(System.in);
		
		System.out.println(str.hashCode());
		// String이 Object μƒμ†λ°›μŒ
		System.out.println(sc.hashCode());
		// Scannerκ°€ Object μƒμ†λ°›μŒ
		
	}
	
	public void ex5() { // toString μ‚¬μš© 예제
		
		Person p = new Person("κΉ€μ² μˆ˜", 17, "ν•œκ΅­");
		
		System.out.println(p.toString());

		System.out.println(p);
		// print ꡬ문 μˆ˜ν–‰ μ‹œ μ°Έμ‘°λ³€μˆ˜λͺ…을 μž‘μ„±ν•˜λ©΄
		// μžλ™μœΌλ‘œ toString() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•΄μ„œ 좜λ ₯ν•œλ‹€
		
		Student std = new Student("이백점", 18, "미ꡭ", 2, 6);

		System.out.println(std.toString());
		System.out.println(std);
		
		Employee emp = new Employee("μ΅œμ§€μ€", 30, "ν•œκ΅­", "khμ •λ³΄κ΅μš±μ›");
		
		System.out.println(emp);
				
	}
}

3. λ‹€ν˜•μ„±

- λ‹€ν˜•μ„±μ΄λž€?

: 객체 지ν–₯ μ–Έμ–΄μ˜ νŠΉμ§• 쀑 ν•˜λ‚˜λ‘œ β€˜λ‹€μ–‘ν•œ ν˜•νƒœλ₯Ό κ°–λŠ”λ‹€β€™λΌλŠ” 뜻으둜 ν•˜λ‚˜μ˜ ν–‰λ™μœΌλ‘œ μ—¬λŸ¬ 가지 일을 μˆ˜ν–‰ν•˜λŠ” κ°œλ….
: 상속을 μ΄μš©ν•œ 기술둜 λΆ€λͺ¨ 클래슀 νƒ€μž… μ°Έμ‘°λ³€μˆ˜ ν•˜λ‚˜λ‘œ 상속 관계에 μžˆλŠ” μ—¬λŸ¬ νƒ€μž…μ˜ μžμ‹ 객체λ₯Ό μ°Έμ‘°ν•  수 μžˆλŠ” 기술

- μ—… μΊμŠ€νŒ…(Up Casting)

: 상속 관계에 μžˆλŠ” λΆ€λͺ¨, μžμ‹ 클래슀 간에
λΆ€λͺ¨νƒ€μž…μ˜ μ°Έμ‘°ν˜• λ³€μˆ˜κ°€ λͺ¨λ“  μžμ‹ νƒ€μž… 객체의 μ£Όμ†Œλ₯Ό μ°Έμ‘°ν•  수 있음
: μžμ‹ -> λΆ€λͺ¨λ‘œ μΊμŠ€νŒ…

- λ‹€μš΄ μΊμŠ€νŒ…(Down Casting)

: λΆ€λͺ¨νƒ€μž… μ°Έμ‘°λ³€μˆ˜κ°€ μžμ‹ 객체λ₯Ό μ°Έμ‘°ν•˜λŠ” 기술둜 μ—…μΊμŠ€νŒ… μƒνƒœμ—μ„œλ§Œ 진행할 수 μžˆλ‹€.
: λΆ€λͺ¨νƒ€μž…을 μžμ‹νƒ€μž…μœΌλ‘œ "κ°•μ œ ν˜•λ³€ν™˜"ν•΄μ„œ μžμ‹ 객체의 본래 ν•„λ“œ, λ©”μ†Œλ“œλ₯Ό μ‚¬μš© κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€.
: μ£Όμ˜ν•  점 -> μ—°μ‚°μžκ°€ ν˜•λ³€ν™˜ μ—°μ‚°μžλ³΄λ‹€ μš°μ„ μˆœμœ„κ°€ λ†’μŒ -> ()둜 ν•œ 번 더 μ²˜λ¦¬ν•΄μ€˜μ•Όν•¨
System.out.println(((Tesla)c1).getBatteryCapacity());
: λ‹€μš΄ μΊμŠ€νŒ… μ‹œ ν˜•λ³€ν™˜ μ˜ˆμ™Έ(μžμ‹ <=> μžμ‹ κ°„)κ°€ λ°œμƒν•  수 μžˆλŠ” λ¬Έμ œκ°€ 있음. -> istanceofλ₯Ό μ‚¬μš©ν•΄ ν˜•λ³€ν™˜(λ‹€μš΄μΊμŠ€νŒ…)이 κ°€λŠ₯ν•œμ§€ ν™•μΈν•΄μ•Όν•œλ‹€!

- instanceof μ—°μ‚°μž

: 객체의 μžλ£Œν˜•μ„ κ²€μ‚¬ν•˜λŠ” μ—°μ‚°μž -> μ°Έμ‘°ν•˜λŠ” 객체가 νŠΉμ • μžλ£Œν˜•μ΄κ±°λ‚˜ λΆ€λͺ¨ μͺ½ 상속관계인지 확인
: ν˜„μž¬ μ°Έμ‘°ν˜•λ³€μˆ˜κ°€ μ–΄λ–€ 클래슀 ν˜•μ˜ κ°μ²΄μ£Όμ†Œλ₯Ό μ°Έμ‘°ν•˜κ³  μžˆλŠ”μ§€ 확인할 λ•Œ μ‚¬μš©
: 클래슀 νƒ€μž…μ΄ 맞으면 true, λ§žμ§€ μ•ŠμœΌλ©΄ false λ°˜ν™˜

- 바인딩

: μ‹€μ œ μ‹€ν–‰ν•  λ©”μ†Œλ“œ μ½”λ“œμ™€ ν˜ΈμΆœν•˜λŠ” μ½”λ“œλ₯Ό μ—°κ²° μ‹œν‚€λŠ” 것
1. 정적바인딩
: "ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜κΈ° μ „" 컴파일 λ‹¨κ³„μ—μ„œ λ©”μ†Œλ“œμ™€ λ©”μ†Œλ“œ ν˜ΈμΆœλΆ€λ₯Ό μ—°κ²°
2. 동적 바인딩
: "컴파일 μ‹œ" 정적 λ°”μΈλ”©λœ λ©”μ†Œλ“œλ₯Ό μ‹€ν–‰ν•  λ‹Ήμ‹œμ˜ 객체 νƒ€μž…μ„ κΈ°μ€€μœΌλ‘œ 바인딩 λ˜λŠ” 것

- λ‹€ν˜•μ„± 예제

βœ… Car 클래슀 (λΆ€λͺ¨)

package edu.kh.poly.ex1.mode.vo;

public class Car {
	
	private String engine; // 엔진
	private String fuel; // μ—°λ£Œ
	private int wheel; // 휠개수
	
	public Car() {}

	// λ§€κ°œλ³€μˆ˜ μƒμ„±μž 단좕킀 : alt + shift + s -> o -> enter
	public Car(String engine, String fuel, int wheel) {
		super(); // Object 상속
		this.engine = engine;
		this.fuel = fuel;
		this.wheel = wheel;
	}

	
	
	public String getEngine() {
		return engine;
	}

	public void setEngine(String engine) {
		this.engine = engine;
	}

	public String getFuel() {
		return fuel;
	}

	public void setFuel(String fuel) {
		this.fuel = fuel;
	}

	public int getWheel() {
		return wheel;
	}

	public void setWheel(int wheel) {
		this.wheel = wheel;
	}
	
	
	// Object.toString() μ˜€λ²„λΌμ΄λ”©
	@Override // μ˜€λ²„λΌμ΄λ”© ν–ˆλ‹€λŠ”κ±Έ μ•Œλ €μ£ΌλŠ” Override Annotation
	public String toString() {
		return engine + "/" + fuel + "/" + wheel;
	}

}

βœ… Telsa 클래슀 (μžμ‹)

package edu.kh.poly.ex1.mode.vo;

public class Tesla extends Car{ // μ „κΈ°μ°¨
	
	private int batteryCapacity;// λ°°ν„°λ¦¬μš©λŸ‰
	
	
	public Tesla() {}

	// alt + shift + s -> o -> μ•„λž˜λ°©ν–₯ν‚€ -> enter
	// λ§€κ°œλ³€μˆ˜ μƒμ„±μž + 상속받은 것도 포함
	public Tesla(String engine, String fuel, int wheel, int batteryCapacity) {
		super(engine, fuel, wheel);
		this.batteryCapacity = batteryCapacity;
	}

	
	public int getBatteryCapacity() {
		return batteryCapacity;
	}


	public void setBatteryCapacity(int batteryCapacity) {
		this.batteryCapacity = batteryCapacity;
	}

	@Override // Car.toString을 μ˜€λ²„λΌμ΄λ”©ν•œ 것
	public String toString() {
		return super.toString() + batteryCapacity;
	}
	
}

βœ… Spark 클래슀 (μžμ‹)

package edu.kh.poly.ex1.mode.vo;

public class Spark extends Car{ // κ²½μ°¨
	
	
	private double discountOffer; // ν• μΈν˜œνƒ
	
	
	public Spark() {}


	public Spark(String engine, String fuel, int wheel, double discountOffer) {
		super(engine, fuel, wheel);
		this.discountOffer = discountOffer;
	}


	public double getDiscountOffer() {
		return discountOffer;
	}


	public void setDiscountOffer(double discountOffer) {
		this.discountOffer = discountOffer;
	}

	
	
	@Override
	public String toString() {
		return super.toString() + discountOffer;
	}
}

βœ… PolyService 클래슀 (μ‹€ν–‰ν΄λž˜μŠ€)

package edu.kh.poly.ex1.model.service;

import java.nio.file.spi.FileSystemProvider;

import edu.kh.poly.ex1.mode.vo.Car;
import edu.kh.poly.ex1.mode.vo.Spark;
import edu.kh.poly.ex1.mode.vo.Tesla;

public class PolyService {
	
	public void ex1() { // λ‹€ν˜•μ„± 확인 예제
		
		// Car 객체 생성
		Car car = new Car(); 
		// λΆ€λͺ¨ νƒ€μž… μ°Έμ‘°λ³€μˆ˜ = λΆ€λͺ¨ 객체
		
		// Tesla 객체 생성
		Tesla tesla = new Tesla();
		// μžμ‹νƒ€μž… μ°Έμ‘°λ³€μˆ˜ = μžμ‹ 객체
		
		// *******************λ‹€ν˜•μ„±*********************
		
		Car car2 = new Tesla();
		// λΆ€λͺ¨νƒ€μž… μ°Έμ‘°λ³€μˆ˜ = μžμ‹ 객체
		// Tesla 객체λ₯Ό μ°Έμ‘°ν•˜λŠ” λ³€μˆ˜μ˜ νƒ€μž…μ΄ Car(λΆ€λͺ¨)이기 λ•Œλ¬Έμ—
		// Tesla 객체가 Car(λΆ€λͺ¨)객체둜 변화함
		
		Spark spark = new Spark();
		
		Car car3 = new Spark();
		// λΆ€λͺ¨νƒ€μž… μ°Έμ‘°λ³€μˆ˜ = μžμ‹ 객체 
		
		// ****λ‹€ν˜•μ„±(μ—…μΌ€μŠ€νŒ…)μž‘μ„± 방법*****
		// 1) μžμ‹κ°μ²΄κ°€ λΆ€λͺ¨κ°μ²΄λ‘œ λ³€ν•˜μ˜€κΈ° λ•Œλ¬Έμ—
		// μžμ‹λ§Œμ˜ κ³ μœ ν•œ ν•„λ“œ, λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€.
		
		// 1-1) car(λΆ€λͺ¨ = λΆ€λͺ¨)
		car.setEngine("v6 6기톡 엔진");
		car.setFuel("휘발유");
		car.setWheel(4);
		// Car λ©”μ†Œλ“œ λͺ¨λ‘ μ‚¬μš© κ°€λŠ₯
		
		// 1-2) tesla (μžμ‹ = μžμ‹)
		tesla.setEngine("μ „κΈ°λͺ¨ν„°");
		tesla.setFuel("μ „κΈ°");
		tesla.setWheel(4);
		tesla.setBatteryCapacity(1000000);
		// Tesla λ©”μ†Œλ“œ λͺ¨λ‘ μ‚¬μš© κ°€λŠ₯
		
		// 1-3) car2 (λΆ€λͺ¨ = μžμ‹(Tesla))
		car2.setEngine("μ „κΈ°λͺ¨ν„°");
		car2.setFuel("μ „κΈ°");
		car2.setWheel(4);
		//car2.setBatteryCapacity(1000000);
		// Tesla λ³Έμ—°μ˜ λ©”μ†Œλ“œ μ‚¬μš© λΆˆκ°€
		//The method setBatteryCapacity(int) is undefined for the type Car
		
		car3.setEngine("κ²½μ°¨ 엔진");
		car3.setFuel("휘발유");
		car3.setWheel(4);
		//car3.discountOffer(4);
		// Spark λ³Έμ—°μ˜ λ©”μ†Œλ“œ μ‚¬μš© λΆˆκ°€
		
		//**************************************
		
		// 2) λ‹€ν˜•μ„±μ„ μ΄μš©ν•œ 객체 λ°°μ—΄
		
		// 객체 λ°°μ—΄ : 같은 객체 μ°Έμ‘° μžλ£Œν˜•μ˜ λ³€μˆ˜λ₯Ό ν•˜λ‚˜μ˜ 묢음으둜 λ‹€λ£¨λŠ” 것
					// λΆ€λͺ¨νƒ€μž… μ°Έμ‘° μžλ£Œν˜•μ˜ λ³€μˆ˜λ₯Ό ν•˜λ‚˜μ˜ 묢음으둜 λ‹€λ£¨λŠ” 것
		
		Car[] arr = new Car[3]; // λΆ€λͺ¨νƒ€μž… μ°Έμ‘°λ³€μˆ˜ λ°°μ—΄ μ„ μ–Έ 및 ν• λ‹Ή
		// 각 λ°°μ—΄μ˜ μš”μ†Œκ°€ Car νƒ€μž…
		
		arr[0] = car; // Car μ£Όμ†Œ
		arr[1] = car2; // Tesla μ£Όμ†Œ
		arr[2] = car3; // Spark μ£Όμ†Œ
	
		for(int i = 0; i < arr.length; i++) {
			
			System.out.println(i + "번째 인덱슀의 " + arr[i].getEngine());
			System.out.println(i + "번째 인덱슀의 " + arr[i].getFuel());
		}
		
		// 상속 + λ‹€ν˜•μ„±μ΄ λ˜μ–΄μžˆλŠ” μƒνƒœλ‘œ
		// μƒμ†νŠΉμ§• : Car μƒμ†ν΄λž˜μŠ€λŠ” λͺ¨λ‘ getEngine()을 가지고 μžˆλ‹€λ₯Ό μ •μ˜
		// λ‹€ν˜•μ„±(μ—…μΊμŠ€νŒ…) : λΆ€λͺ¨νƒ€μž… μ°Έμ‘°λ³€μˆ˜ arr[i]둜 μžμ‹ 객체λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€. 
		
		}
	
	
	public void ex2() { // 3) λ‹€ν˜•μ„±(μ—…μΊμŠ€νŒ…)을 μ΄μš©ν•œ λ§€κ°œλ³€μˆ˜ μ‚¬μš©λ²•
		
		Tesla t = new Tesla("μ „κΈ°λͺ¨ν„°", "μ „κΈ°", 4, 1000000);
		
		Spark s = new Spark("경차엔진", "휘발유", 4, 0.5);
		
		Car c = new Car("κ²½μœ μ—”μ§„", "경유", 4);
		
		
		printCar(t);
		printCar(s);
		printCar(c);
		System.out.println("================================");
		
		// 4) λ‹€ν˜•μ„±μ„ μ΄μš©ν•œ λ³€ν™˜ν˜• μ‚¬μš©λ²•
		//Car[] arr = {new Car(), new Tesla(), new Spark()};
		
		Car[] arr = {createCar(1), createCar(2), createCar(3)};
					// Car			// Car		// Car
									// (Tesla)	// (Spark)
		
		// instanceof μ—°μ‚°μž : 객체의 μžλ£Œν˜•μ„ κ²€μ‚¬ν•˜λŠ” μ—°μ‚°μž
		// -> μ°Έμ‘°ν•˜λŠ” 객체가 νŠΉμ • μžλ£Œν˜•μ΄κ±°λ‚˜ λΆ€λͺ¨μͺ½ 상속관계인지 확인
		
		System.out.println( arr[1] instanceof Tesla ); // true
		System.out.println( arr[1] instanceof Spark ); // false
		System.out.println( arr[1] instanceof Car ); // true
		
	}
	
	// 전달받은 Car λ˜λŠ” μžμ‹ 객체의 엔진, μ—°λ£Œ, 바퀴 개수λ₯Ό 좜λ ₯ν•˜λŠ” λ©”μ„œλ“œ
	// λ§€κ°œλ³€μˆ˜μ— λΆ€λͺ¨νƒ€μž… μ°Έμ‘°λ³€μˆ˜λ₯Ό μž‘μ„±ν•˜λ©΄ λͺ¨λ“  μžμ‹ 객체λ₯Ό 전달받을 수 μžˆλ‹€.
	// λΆ€λͺ¨νƒ€μž… μ°Έμ‘°λ³€μˆ˜ = μžμ‹νƒ€μž… 객체
	// λ‹€ν˜•μ„±μ˜ μ—…μΊμŠ€νŒ… λͺ¨μ–‘κ³Ό κ°™λ‹€.
	// tempμ—λŠ” Tesla, Spark, Car의 μ£Όμ†Œκ°€ λ„˜μ–΄μ™€λ„ λœλ‹€(μ—…μΊμŠ€νŒ…)
	public void printCar(Car temp){
		
		System.out.println("엔진 : " + temp.getEngine());
		System.out.println("μ—°λ£Œ : " + temp.getFuel());
		System.out.println("바퀴 갯수 : " + temp.getWheel());
		System.out.println();
		
	}

	
	public Car createCar(int num) {
		
		Car result = null;
		
		switch(num) {
		case 1 : result = new Car(); break;
		case 2 : result = new Tesla(); break;
		case 3 : result = new Spark(); break;
		}
		
		return result;
	}
	
	
	public void ex3() {
		
		// ********** λ‹€ν˜•μ„± 쀑 λ‹€μš΄μΊμŠ€νŒ… ***************
		
		// λ‹€μš΄ μΊμŠ€νŒ…μ΄λž€?
		// λΆ€λͺ¨νƒ€μž… μ°Έμ‘°λ³€μˆ˜κ°€ μžμ‹ 객체λ₯Ό μ°Έμ‘°ν•˜λŠ” 기술둜
		// μ—…μΊμŠ€νŒ… μƒνƒœμ—μ„œλ§Œ 진행할 수 μžˆλ‹€.
		// λΆ€λͺ¨νƒ€μž…을 μžμ‹νƒ€μž…μœΌλ‘œ "κ°•μ œ ν˜•λ³€ν™˜"ν•΄μ„œ
		// μžμ‹ 객체의 본래 ν•„λ“œ, λ©”μ†Œλ“œλ₯Ό μ‚¬μš© κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€.
		
		Car c1 = new Tesla("μ „κΈ°λͺ¨ν„°", "μ „κΈ°", 4, 50000000);
		
		System.out.println(((Tesla)c1).getBatteryCapacity());
		// 주의!! . μ—°μ‚°μžκ°€ ν˜•λ³€ν™˜ μ—°μ‚°μžλ³΄λ‹€ μš°μ„ μˆœμœ„κ°€ λ†’μŒ -> ()둜 ν•œ 번 더 μ²˜λ¦¬ν•΄μ€˜μ•Όν•¨
		
		
		Tesla t1 = (Tesla)c1; // λ‹€μš΄μΊμŠ€νŒ… ν›„ 얕은볡사
		System.out.println(t1.getBatteryCapacity());
		
	}
	
	public void ex4() {
		// λ‹€μš΄ μΊμŠ€νŒ… 주의 사항!
		
		Car c1 = new Tesla();
		
//		Spark s1 = (Spark)c1;
		
		// c1이 μ°Έμ‘°ν•˜λŠ” κ°μ²΄λŠ” Tesla인데
		// Spark μ°Έμ‘°λ³€μˆ˜λ‘œ Teslaλ₯Ό μ°Έμ‘°ν•˜λ €κ³ ν•˜λ©΄ λ¬Έμ œκ°€ 있음.
		// java.lang.ClassCastException: : ν˜•λ³€ν™˜ μ˜ˆμ™Έ
		
		// 해결방법 : istanceof와 같이 μ‚¬μš©ν•΄μ•Όν•œλ‹€!
		
		if(c1 instanceof Spark) {
			Spark s1 = (Spark)c1; // λ‹€μš΄μΊμŠ€νŒ…
			System.out.println("성곡");
		}
		
		System.out.println("μ‹€νŒ¨ (Spark νƒ€μž…μ΄ μ•„λ‹˜)");
		
	}
	
	public void ex5() {
		// 바인딩 : μ‹€μ œ μ‹€ν–‰ν•  λ©”μ†Œλ“œ μ½”λ“œμ™€ ν˜ΈμΆœν•˜λŠ” μ½”λ“œλ₯Ό μ—°κ²°μ‹œν‚€λŠ” 것
		
		
		Car c1 = new Car("κ²½μœ μ—”μ§„", "경유", 8);
		
		System.out.println(c1.getEngine());
		// Car 객체에 μžˆλŠ” getEngine() λ©”μ„œλ“œλ₯Ό 호좜 == 바인딩
		
		// ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ „
		// μ»΄νŒŒμΌλŸ¬λŠ” getEngine() λ©”μ†Œλ“œκ°€ Car에 μžˆλŠ”κ±Έλ‘œ μΈμ‹ν•΄μ„œ
		// c1.getEngine()ν˜ΈμΆœμ½”λ“œμ™€
		// edu.kh.poly.ex1.mode.vo.Car.getEngine() λ©”μ†Œλ“œ μ½”λ“œλ₯Ό μ—°κ²°
		// -> 정적 바인딩
		
		System.out.println(c1.toString());
		// String edu.kh.poly.ex1.mode.vo.Car.toString()
		// Car μ°Έμ‘°λ³€μˆ˜ c1을 μ΄μš©ν•΄μ„œ
		// Car κ°μ²΄μ—μžˆλŠ” μ˜€λ²„λΌμ΄λ”©λœ toString() λ©”μ†Œλ“œλ₯Ό 호좜
		
		// *** λ‹€ν˜•μ„± 적용 μ‹œ 바인딩***
		Car c2 = new Spark("경차엔진", "휘발유", 4, 0.5);
		// μ—…μΊμŠ€νŒ… 적용 -> λΆ€λͺ¨ λΆ€λΆ„λ§Œ μ°Έμ‘° κ°€λŠ₯ν•œ μƒνƒœ
		
		System.out.println(c2.toString());
		// String edu.kh.poly.ex1.mode.vo.Car.toString()
		
		// μ°Έμ‘°λ³€μˆ˜ c2κ°€ Carνƒ€μž… μ΄λ―€λ‘œ
		// toString()도 Car의 toString()을 호좜 - 정적 바인딩
		
		// ν•˜μ§€λ§Œ 싀행해보면 μžμ‹Spark의 toString이 ν˜ΈμΆœλ˜λŠ” 것을 확인할 수 μžˆλ‹€.
		// -> 컴파일 μ‹œμ—λŠ” λΆ€λͺ¨(Car)와 바인딩
		// -> μ‹€ν–‰ μ‹œμ—λŠ” μžμ‹(Spark)에 μ˜€λ²„λΌμ΄λ”©λœ λ©”μ†Œλ“œμ™€ 바인딩 == 동적 바인딩
		
	}
}

βœ… PolyRun 클래슀

package edu.kh.poly.ex1.run;

import edu.kh.poly.ex1.model.service.PolyService;

public class PolyRun {

	public static void main(String[] args) {
		
		PolyService service = new PolyService();
		
		service.ex1();
		service.ex2();
		service.ex3();
		service.ex4();
		service.ex5();
		
	}

}

0개의 λŒ“κΈ€