package encapsulation.badcase;
public class MyDate{
public int day;
public int month;
public int year;
public String toString(){
return this.year + this.month + this.day;
}
}
package encapsulation.goodcase;
public class MyDate{
private int day;
private int month;
private int year;
public void setDay(int d){
if ( (d<1) || (d>31)){
throw new RuntimeException("잘못된 날짜 입력");
}else{
day = d;
}
}
public int gatDay(){
return day;
}
public String toString(){
return this.year + this.month + this.day;
}
}
}
textStudent
- 이름(name)
- 나이(age)
- 학과(major)
Teacher
- 이름(name)
- 나이(age)
- 담당과목(subject)
Employee
- 이름(name)
- 나이(age)
- 담당부서(department)
textPerson ← 부모 클래스
- 이름(name)
- 나이(age)
├─ Student ← 자식 클래스
│ - 학과(major)
│
├─ Teacher ← 자식 클래스
│ - 담당과목(subject)
│
└─ Employee ← 자식 클래스
- 담당부서(department)
package inheritance.goodcase;
public class Person {
String name;
int age;
String getDetails() {
return "이름: " + name + "\t나이: " + age;
}
}
package inheritance.goodcase;
public class Student extends Person {
String major; *// 학과*
}
package inheritance.goodcase;
public class Teacher extends Person {
String subject; *// 담당과목*
}
@Override 어노테이션을 사용하면 컴파일러가 정확히 재정의되었는지 검증해준다.@Override는 선택사항이지만, 실수를 방지하기 위해 사용하는 것이 좋다.부모 클래스
package inheritance.goodcase;
public class Person {
String name;
int age;
String getDetails() {
return "이름: " + name + "\t나이: " + age;
}
}
자식 클래스에서 재정의
package inheritance.overriding;
public class Student extends Person {
String major;
@Override
String getDetails() {
return "이름: " + name + "\t나이: " + age + "\t전공: " + major;
}
}
public class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person(String name) {
this(name, 1); // 다른 생성자 호출
}
public Person() {
this("이름없음"); // 또 다른 생성자 호출
}
String getDetails() {
return "이름: " + name + "\t나이: " + age;
}
}
package inheritance.super_;
public class Teacher extends Person {
private String subject;
public Teacher(String name, int age, String subject) {
super(name, age); // 부모 생성자 호출 생성자이기에 super.Person이렇게 안한다.
this.subject = subject;
}
@Override
public String getDetails() {
return super.getDetails() + "\t과목: " + subject; // 부모 메서드 사용
}
}
접근 제한자는 클래스, 변수, 메서드, 생성자 등 멤버의 접근 가능 범위를 지정하는 키워드이다.
| 접근 제한자 | 기호 | 같은 클래스 | 같은 패키지 | 상속 관계(다른 패키지) | 다른 패키지 |
|---|---|---|---|---|---|
| public | + | O | O | O | O |
| protected | # | O | O | O | X |
| (package-private) | (공백) | O | O | X | X |
| private | - | O | X | X | X |
public class Super {
public int num1 = 10;
}
외부 패키지에서도 사용 가능:
Super s = new Super();
System.out.println(s.num1); // 정상 출력
public class Super {
protected int num2 = 20;
}
다른 패키지에서 상속한 경우:
public class Sub extends Super {
public void print() {
System.out.println(num2); // 접근 가능
}
}
public class Super {
int num3 = 30; // package-private
}
다른 패키지에서는 접근 불가:
System.out.println(num3); // 오류 발생
public class SomeClass {
private int num4 = 40;
public int getNum4() {
return num4; // 내부에서만 직접 접근 가능
}
}
다른 클래스에서 직접 접근 불가:
SomeClass s = new SomeClass();
System.out.println(s.getNum4()); // 가능
System.out.println(s.num4); // 오류 발생