[Java] 7.Object-oriented Programming_객체지향③

말랑이·2023년 7월 12일
0

JAVA

목록 보기
12/13
post-thumbnail

1 제어자

🖤 제어자(modifier) : 클래스, 변수, 메서드선언부에 사용 → 부가적 의미를 부여함

구분제어자
접근제어자public, protected, (default), private
그 외static, final, abstract •••
  • class, 멤버 변수 및 메서드에 많이 사용

  • 하나의 대상 → 여러 제어자 조합가능 ✅

  • 접근제어자 → 네가지 중 하나만 선택사용 🚨

  • 접근제어자를 가장 왼쪽에 둠

1️⃣ 제어자 static

🖤 static : class 멤버와 같이 공통적인 의미를 가짐

  • 인스터스변수 → 하나의 클래스로부터 생성되어도, 각기 다른 값을 유지함

  • 클래스변수(static 멤버변수) → 인스턴스에 관계없이 항상 같은 값 유지

  • static + 멤버변수, 메서드, 초기화블럭클래스에 관계된 것이기 때문에 객체생성 ❌ , 바로 사용가능 ✅

  • static 메서드는 객체를 생성하지 않고 호출이 가능하므로 속도향상에 도움

제어자대상의미
static멤버변수- 모든 인스턴스에 공통적으로 사용하는 클래스변수
(= 클래스변수)- 객체(인스턴스)를 따로 생성하지 않고 바로 사용가능
- 클래스가 메모리에 로드될 때 생성됨
메서드- 객체(인스턴스)를 생성하지 않고 호출이 가능한 static 메서드
(= static 메서드)- static 메서드 내에서는 인스턴스멤버 사용불가

2️⃣ 제어자 final

🖤 final : 마지막의, 변경 불가한의 의미를 가짐

  • final + 변수 : 값 변경 불가능한 상수 ⛔️

  • final + 메서드 : 조상클래스로부터 상속받아 메서드내용을 자손에 맞게 변경하는 오버라이딩 불가능 ⛔️

  • final + 클래스 : 자신을 확장하는 자손클래스 정의 불가능 ⛔️

제어자대상의미
final클래스- 확장(변경) 불가능한 클래스
- 다른 클래스의 조상이 될 수 없음
메서드- 변경될 수 없는 메서드
- 오버라이딩 불가능
멤버, 지역변수- 값을 변경할 수 없는 상수

3️⃣ 제어자 abstract

🖤 abstract : 미완성된 메서드, 클래스를 의미함

  • 메서드 선언부 ✅ + 메서드 구현부 ⛔️

  • 실제 수행내용(구현부)가 없는, 미완성 메서드가 존재하는 미완성 클래스

  • 미완성 설계도이므로 객체생성 불가능 🚨

제어자대상의미
abstract클래스클래스 내, 추상메서드가 선언되어 있음을 의미
메서드선언부 ✅, 구현부 ⛔️ → 추상메서드임을 알림

2 접근제어자

🖤 접근제어자(access modifier) : 멤버(변수, 메서드) 또는 클래스(+생성자)외부에서 접근하지 못하도록 제한하는 역할

1️⃣ 접근제어자 종류

접근제어자제한범위
private같은 클래스 내에서만 접근가능
(default)같은 패키지 내에서만 접근가능
protected같은 패키지 + 상속관계에 있는 (다른 패키지)자손클래스 접근가능
public접근제한 없음

2️⃣ 접근제어자 default

  • 실제로 명시 ❌

  • 따로 접근제어자가 지정되어있지 않은 경우 → 자동지정 값

  • 즉, 아무런 접근제어자도 붙어있지 않은 것을 의미함


3 캡슐화와 접근제어자

🖤 캡슐화(encqpsulation) : 접근제어자를 활용하여 멤버(변수, 메서드) 또는 클래스(+생성자) 데이터를 감추고 보호하는 개념

1️⃣ 캡슐화 사용이유

  • class 내부에 선언된 데이터를 보호하기 위해서

    • 데이터유효성 유지

    • 외부에서 주요데이터 변경방지

  • 외부에서 불필요하거나, 내부적으로만 사용되는 부분을 감춤

    • 데이터복잡성 감소

2️⃣ 캡슐화 미사용 예

class Time {
	public int hour;
    public int minute;
    public int second;
}

Time time = new Time(); // 객체생성
time.hour = 25; // 데이터유효성 깨짐

문제점

  • class 멤버(인스턴스)변수 → public 선언

  • 객체 생성 후, 멤버변수에 직접 접근하여 값을 변경해도 막을 방법이 없음 🚨

해결방안

  • 멤버변수 → private 선언

  • ② 멤버변수 값을 읽고 변경할 수 있는 public 메서드 제공

  • ③ public 메서드가 유효성검사 후, 멤버변수 값 변경하도록 유도

3️⃣ Java code

class Capsule {
    // 멤버(인스턴스)변수 -> private 선언
    private int age;
    private String name;

    // 접근제한없는 메서드 -> 멤버(인스턴스)변수 간접적접근 유도
    public int getAge() { // 값 읽는 getter
        return age;
    }

    public String getName() {
        return name;
    }

    public void setAge(int age) { // 값 변경하는 setter
        this.age = age;
    }

    // 공백확인(조건, 유효성검사)메서드
    // Capsule 클래스 내에서만 사용 -> private 선언
    private boolean checkName(String name) {
        return name.length() > 0; // 만족하면 True 반환
    }

    public void setName(String name) {
        this.name = checkName(name) ? name : "Null";
    }
}
class Object6 {
    public static void main(String[] args) {
        // 객체생성
        Capsule capsule = new Capsule();
        // capsule.age; -> private라서 접근불가
        // capsule.name; -> private라서 접근불가
        // 직접접근이 아닌, 간접접근으로 해결 "메서드를 통한 접근"

        capsule.setAge(22);
        capsule.setName("mallang");

        System.out.println("capsule.getName() = " + capsule.getName());
        System.out.println("capsule.getAge() = " + capsule.getAge());

        // 유효성검사 예외
        capsule.setName("");
        System.out.println("capsule.getName() = " + capsule.getName());
    }
}

4️⃣ Getter와 Setter

종류메서드이름의미
Getterget멤버변수명멤버변수 값 읽음
Setterset멤버변수명멤버변수 값 설정

4 다형성

🖤 다형성(polymorphism)

  • 여러가지 형태를 가질 수 있는 능력
  • 한 type의 참조변수 → 여러 type 객체참조 가능

1️⃣ 다형성 규칙

[조상클래스 type] 참조변수 = new [자손클래스 type 인스턴스]
  • 조상타입 참조변수 ➡️ 자손타입 인스턴스 참조

    • Tv tv = new SmartTv();
  • 자손타입 참조변수 ➡️ 조상타입 인스턴스 참조 ⛔️

    • SmartTv smartTv = new Tv();

2️⃣ 다형성 주의점

  • 두 class가 서로 상속관계이 있다는 전제하에 사용가능

  • 다형성으로 참조된 객체는 조상으로부터 상속받은 멤버요소만 사용가능 ⭐️

3️⃣ Java code

class Mammalia {
    // 포유류는 새끼를 낳고 수유를 한다
    public void giveFeed() {
        System.out.println("모유수유를 합니다");
    }

    public void giveBirth() {
        System.out.println("새끼를 낳습니다");
    }
}

class Whale extends Mammalia {
    // 고래는 포유류이면서 바다에 살며 수영이 가능하다

    // 자손클래스 메서드
    public void swimming() {
        System.out.println("수영을 합니다");
    }

    // 조상클래스(상속받은) 메서드 오버라이딩
    @Override
    public void giveFeed() {
        System.out.println("고래는 모유수유를 합니다");
    }

    @Override
    public void giveBirth() {
        System.out.println("고래는 새끼를 낳습니다");
    }
}

class Object7 {
    public static void main(String[] args) {
        // 조상타입 참조변수 -> 자손타입 인스턴스참조 가능
        Mammalia mammalia = new Whale();

        // 조상클래스로부터 상속받은 멤버만 사용가능
        mammalia.giveFeed();
        mammalia.giveBirth();
    }
}
profile
🐰 I'm Sunyeon-Jeong, mallang

0개의 댓글