6일차 - 객체지향(은닉, 상속, 접근제한자)

은채의 성장통·2025년 6월 4일

KCC정보통신

목록 보기
8/30

노션 주소

객체지향 프로그래밍

1.은닉

  • 데이터와 해당 데이터를 다루는 메서드(함수)를 하나의 단위로 묶는것
    • 데이터를 보호하고 외부에서의 접근을 제한한다.
    • 클래스의 멤버변수를 private으로 선언하여 외부에서의 직접적인 접근을 제

1.1 은닉 - bad case

  • 은닉을 사용하지 않는 클래스의 예
  • 하지만 오류없이 정상적으로 작동한다
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;
	}
}

1.2 은닉 - good case

  • 멤버변수들은 모두 private로 선언되어 있습니다.
  • private 접근 제한자는 해당멤버의 참조범위를 자신의 클래스내로 제한하기에 다른 외부 클래스에서 이 변수를 직접 참조할수 없다
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;
		}
	}
}
	


2. 상속 (Inheritance)

  • 단일 상속만 가능하다 (자바는 한 번에 하나의 부모 클래스만 상속 가능).
  • 기존 클래스를 확장(extends)하여 새로운 클래스를 만드는 것.
  • 생성자는 상속되지 않는다.
  • final 클래스는 상속할 수 없다.
  • 모든 클래스의 최상위에는 Object 클래스가 있다 (toString(), hashCode(), equals() 등 기본 메서드 제공).
  • extends 키워드로 상속을 표현한다.
  • 부모 클래스의 멤버(변수, 메서드)는 자식 클래스에서 사용 가능하지만, private 멤버는 자식 클래스에서 접근 불가.

  • [상속관계가 없을 때]
textStudent
- 이름(name)
- 나이(age)
- 학과(major)

Teacher
- 이름(name)
- 나이(age)
- 담당과목(subject)

Employee
- 이름(name)
- 나이(age)
- 담당부서(department)
  • [상속관계를 적용했을 때]
textPerson         ← 부모 클래스
- 이름(name)
- 나이(age)

   ├─ Student    ← 자식 클래스
   │   - 학과(major)
   │
   ├─ Teacher    ← 자식 클래스
   │   - 담당과목(subject)
   │
   └─ Employee   ← 자식 클래스
       - 담당부서(department)

2.1 상속 - Good Case 코드 예시

  • Person.java (부모 클래스)
package inheritance.goodcase;

public class Person {
    String name;
    int age;

    String getDetails() {
        return "이름: " + name + "\t나이: " + age;
    }
}
  • Student.java (자식 클래스)
package inheritance.goodcase;

public class Student extends Person {
    String major; *// 학과*
}
  • Teacher.java (자식 클래스)
package inheritance.goodcase;

public class Teacher extends Person {
    String subject; *// 담당과목*
}

  • 상속을 사용하면 공통 속성(이름, 나이 등)을 부모 클래스에 선언하고, 각 자식 클래스는 자신의 고유한 속성만 추가하면 되어 코드의 중복을 줄일 수 있습니다.
  • private 멤버는 자식 클래스에서 사용할 수 없으므로, 상속 구조 설계 시 접근 제어자를 적절히 활용해야 합니다.
  • 자바의 모든 클래스는 Object 클래스를 자동으로 상속받습니다.

2.3 메서드 재정의 (Override)

개념

  • 메서드 재정의(Override)는 부모 클래스에서 상속받은 메서드를 자식 클래스에서 같은 이름, 매개변수, 반환형으로 다시 정의하는 것.
  • 상속이 전제되어야 하며, @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;
    }
}

2.4 this와 super

  • this
    • 현재 객체를 참조할 때 사용한다.
    • 같은 클래스 내의 멤버 변수나 다른 생성자를 호출할 때 사용한다.
  • super
    • 부모 객체를 참조할 때 사용한다.
    • 부모 클래스의 생성자나 메서드를 호출할 수 있다.
  • 예시 1: this 사용
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;
    }
}
  • 예시 2: super 사용
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; // 부모 메서드 사용
    }
}

3. 접근 제한자 (Access Modifiers)

접근 제한자는 클래스, 변수, 메서드, 생성자 등 멤버의 접근 가능 범위를 지정하는 키워드이다.

접근 제한자기호같은 클래스같은 패키지상속 관계(다른 패키지)다른 패키지
public+OOOO
protected#OOOX
(package-private)(공백)OOXX
private-OXXX

3.1 public

  • 어디서든 접근 가능하다.
  • 패키지나 상속 관계와 무관하게 외부에서도 사용 가능.
public class Super {
    public int num1 = 10;
}

외부 패키지에서도 사용 가능:

Super s = new Super();
System.out.println(s.num1); // 정상 출력

3.2 protected

  • 같은 패키지 안에서는 누구나 접근 가능.
  • 다른 패키지라 하더라도 상속을 통해 연결된 자식 클래스에서는 접근 가능.
public class Super {
    protected int num2 = 20;
}

다른 패키지에서 상속한 경우:

public class Sub extends Super {
    public void print() {
        System.out.println(num2); // 접근 가능
    }
}

3.3 package-private (default)

  • 접근 제한자를 명시하지 않으면 기본 접근제한자(package-private)가 적용된다.
  • 같은 패키지 내에서만 접근 가능.
  • 다른 패키지에서는 상속을 하더라도 접근 불가능.
public class Super {
    int num3 = 30; // package-private
}

다른 패키지에서는 접근 불가:

System.out.println(num3); // 오류 발생

3.4 private

  • 접근 범위가 가장 좁다.
  • 같은 클래스 내에서만 접근 가능.
  • 외부 클래스, 자식 클래스에서도 접근할 수 없다.
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);      // 오류 발생
profile
인생 별거 없어

0개의 댓글