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
반응형