본문 바로가기
JAVA SE/Code

CODE [20.07.17/Day_08] Java SE / 접근제어자, Inheritance 상속

by 파프리카_ 2020. 7. 17.
728x90
반응형

[ 접근 제어자(Access Modifier) ]

public > protected > default > private

 

public : 어디서나 접근 가능

protected : 동일한 패키지 내에서 접근 가능하나, 상속 관계시에는 어디서나 접근 가능

default : 동일한 패키지 내에서만 접근 가능

private: : 동일한 클래스 내에서만 접근 가능 (다른 클래스에서 접근하려면, getter/setter를 이용하여  접근하여야 한다)

 

클래스 위치

\ org.kosta/Bank.java

package org.kosta;

//접근 제어자 test 예제
//step2.TestAccessModifier 에서 접근한다

public class Bank {
	public void publicTest() {
		System.out.println("public 접근 완료");
	}
	
	protected void protectedTest() {
		System.out.println("protected 접근 완료");
	}

	void defaultTest() {
		System.out.println("default 접근 완료");
	}
	
	private void privateTest() {
		System.out.println("private 접근 완료");
	}
	
}

 

\step2/TestAccessModifier.java

package step2;

// 다른 패키지에서 Bank class를 가져옴
import org.kosta.Bank;

// protected 메서드를 가져오기 위해 상속관계를 만들어줌
class KostaBank extends Bank {
	public void test() {
		protectedTest();
	}
}

public class TestAccessModifier {
	public static void main(String[] args) {
		// import 단축키 : ctrl + shift + O
		Bank bank = new Bank();
		KostaBank kbank = new KostaBank();
		
		bank.publicTest(); // 접근제어자 public 접근 완료

		// bank.protectedTest();
		// error:서로 다른 패키지 -> 상속필요
		kbank.test(); // 상속을 통해 protected 접근 완료
		
		// bank.defaultTest();
		// error: 서로 다른 패키지

		// bank.private();
		// error : 서로 다른 클래스(setter/getter를 통한 접근 필요)

	}
}

 


[ Inheritance 상속 ]

 

extends

\TestInheritance2.java


package step1;

//부모 class = super class
class Animal{
	private int age = 1;
	// error : setter/getter가 없으면, private은 본인 class내에서만 사용가능하다 


	public int getAge() {
		return age;
	}

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

// Person(sub class)은 Animal(super class)을 상속받는다
// Perseon = sub class
class Person extends Animal{
	public void study() {
		System.out.println(getAge()+"살이 공부하다.");
	}
}

public class TestInheritance2 {
	public static void main(String[] args) {
		Person p = new Person(); //자식 객체 생성
		// System.out.println(p.age);
		/* error
		 * age변수는 private 접근 제어자로 선언되어 있고,
		 * private은 자신의 클래스 내에서만 접근 가능
		 * 상속받았어도 클래스가 다르므로 직접 접근 불가
		 */	
		System.out.println(p.getAge());
		// 부모의 private 변수를 setter/getter로 간접 접근하면 된다
	}
}

 

super() 

이 다이어그램을 가지고 코드로 구현해보자

아래 클래스의 메인메서드에 대응되는 클래스를 구현하는 예제

 

// 실행 class

\TestInheritance3.java

package step6;
/* 아래 클래스의 메인메서드에 대응되는 클래스를 구현하는 예제
 * 
 */

// 실행 class
public class TestInheritance3 {
	public static void main(String[] args) {
		// Employee 인스턴스(객체)
		Employee e = new Employee("20", "진드래곤현", 1000);
		System.out.println(e.getEmpNo() + " " 
							+ e.getName() + " "
							+ e.getSalary());
		
		// Engineer 인스턴스(객체)
		Engineer en = new Engineer("19", "레이크희석", 1200, "java");
		System.out.println(en.getEmpNo() + " " 
				+ en.getName() + " "
				+ en.getSalary()+ " "
				+ en.getSkill());
		
		// Manager 인스턴스(객체)
		Manager m = new Manager("10", "정이울", 5000, "HR");
		System.out.println(m.getEmpNo() + " " 
				+ m.getName() + " "
				+ m.getSalary()+ " "
				+ m.getDepartment());
	}
}

 

// Employee Class (부모클래스-Super class)

package step6;

// 부모 클래스 (super class)
public class Employee {
	// 인스턴스 변수
	private String empNo;
	private String name;
	private int salary;
	
	// 생성자
	public Employee(String empNo, String name, int salary) {
		this.empNo = empNo;
		this.name = name;
		this.salary = salary;
	}

	public String getEmpNo() {
		return empNo;
	}

	public void setEmpNo(String empNo) {
		this.empNo = empNo;
	}

	public String getName() {
		return name;
	}

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

	public int getSalary() {
		return salary;
	}

	public void setSalary(int salary) {
		this.salary = salary;
	}
	
	
}

 

// Engineer Class (자식 클래스 - sub class 1 )

: Employee class에서 skill attribute가 추가되었다.

package step6;

class Engineer extends Employee{
	private String skill;
	public Engineer(String empNo, String name, int salary, String skill) {
		super(empNo, name, salary);
		this.skill = skill;
	}
	
	public void setSkill(String skill) {
		this.skill = skill;
	}
	
	public String getSkill() {
		return skill;
	}
}

 

 

// Manager Class (자식 클래스 - sub class 2 )

: Employee class에서 department attribute가 추가되었다.

package step6;

class Manager extends Employee {
	private String department;

	public Manager(String empNo, String name, int salary, String department) {
		super(empNo, name, salary);
		this.department = department;
	}

	public String getDepartment() {
		return department;
	}

	public void setDepartment(String department) {
		this.department = department;
	}

}

 

OverRiding

예제 1)

package step7;

// super class
class Animal{
	public void eat() {
		System.out.println("먹다");
	}
}

// sub class 1
class Person extends Animal{
	Person() {super();} // 생성자는 생략 가능하다.
	// 메서드 오버라이딩 : 부모 메서드를 자신에 맞게 재정의
	public void eat() {
		System.out.println("수저를 이용");
		super.eat(); // 부모 메서드를 이용
	}
}

// sub class 2
class Dog extends Animal{
}

public class TestOverriding {
	public static void main(String[] args) {
		System.out.println("**Person 실행**");
		Person p = new Person();
		p.eat();
		System.out.println("\n**Dog 실행**");
		Dog d = new Dog();
		d.eat();
		/* 출력 :
		 * **Person 실행**
		 * 수저를 이용
		 * 먹다
		 * **Dog 실행**
		 * 먹다
		 */
	}
}

 

예제 2)

 

//실행 class

package step8;

public class TestOverriding2 {
	public static void main(String[] args) {
		Employee e = new Employee("20", "스탑윤", 1500);
		System.out.println(e.getDetails());
		//사원번호:20 사원명:스탑윤 월급:1500
		
		Engineer en = new Engineer("18", "이홍조", 1700, "spring");
		System.out.println(en.getDetails());
		//사원번호:18 사원명:이홍조 월급:1700 기술:spring

	}
}

 

// 부모 class

package step8;

public class Employee {
	private String empId;
	private String name;
	private int salary;

	public Employee(String empId, String name, int salary) {
		// super();
		this.empId = empId;
		this.name = name;
		this.salary = salary;
	}

	public String getEmpId() {
		return empId;
	}

	public void setEmpId(String empId) {
		this.empId = empId;
	}

	public String getName() {
		return name;
	}

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

	public int getSalary() {
		return salary;
	}

	public void setSalary(int salary) {
		this.salary = salary;
	}
	
	public String getDetails() {
		return "사원번호:" +empId+ " 사원명:"+name+" 월급:"+salary;
	}
}

 

 

// 자식 class - overring을 받았다 : super에 !

package step8;

class Engineer extends Employee{
	private String skill;
	
	public String getDetails() {
		return super.getDetails()+" skill: "+skill;
	}
	
	public Engineer(String empId, String name, int salary,String skill) {
		super(empId, name, salary);
		this.skill = skill;
	}
	public String getSkill() {
		return skill;
	}

	public void setSkill(String skill) {
		this.skill = skill;
	}
	
	
}

 

예제 3)

 

// 실행 class

public class TestOverridingEx {
	public static void main(String[] args) {
		Employee e = new Employee("18", "티스진욱", 900);
		System.out.println("Employee"+e+"]");
		// Employee[ empNo=18, name=투스진욱, salary=900 ]
		
		Engineer en = new Engineer("19", "보트율휘", 1000, "java");
		System.out.println("Engineer"+en);
		// Engineer[ empNo=19, name=보트율휘, salary=1000, skill=java ]
		
		Manager m = new Manager("13", "노래영섭", 1500, "개발");
		System.out.println("Manager"+m);
		// Manager[ empNo=13, name=노래영섭, salary=1500, department=개발 ]
	}
}

 

// super class (Employee)

// super class
public class Employee {
	public String empNo;
	public String name;
	public int salary;
	
	public Employee(String empNo, String name, int salary) {
		this.empNo = empNo;
		this.name = name;
		this.salary = salary;
	}
	
	// toString() 메서드 오버라이딩
	@Override
	public String toString() {
		return " [empNo=" + empNo + ", name=" + name + ", salary=" + salary ;
	}
}

 

// sub class 1 (Engineer)

public class Engineer extends Employee{
	public String skill;
	
	public Engineer(String empNo, String name, int salary, String skill) {
		super(empNo, name, salary);
		this.skill = skill;
	}
	
	// toString() 메서드 오버라이딩
	@Override
	public String toString() {
		return super.toString()+", skill="+skill+ "]";
	}

}

 

// sub class 2 (Manager)

public class Manager extends Employee {
	public String department;
	
	public Manager(String empNo, String name, int salary, String department) {
		super(empNo, name, salary);
		this.department = department;
	}
	
	// toString() 메서드 오버라이딩
	@Override
	public String toString() {
		return super.toString()+", department="+department+ "]";
	}
}

 

728x90
반응형