41일차 (2) - java (protected, final, enum)

Yohan·2024년 4월 18일
0

코딩기록

목록 보기
58/156
post-custom-banner

접근제한자 protected

  • 본인 클래스에서는 에러없이 모두 작동
package day08.protec.pac1;

public class A {

    protected int f1;
    int f2; // default (package-private, package-friendly)

    protected void m1() {}
    void m2() {}

    public A() {}
    protected A(int a) {}
    A(double b) {}

    void test() {
        f1 = 1; f2 = 2;
        m1(); m2();
        new A();
        new A(1);
        new A(3.4);
    }
}
  • 같은 패키지인 B클래스에서도 모두 작동
package day08.protec.pac1;

public class B {

    void test() {

        A a = new A(); // public 생성자
        new A(10); // protected 생성자
        new A(3.3); // default 생성자

        a.f1 = 10; a.f2 = 30;
        a.m1(); a.m2();
    }
}
  • 다른 패키지인 C클래스에서는 작동X
package day08.protec.pac2;

import day08.protec.pac1.A;

public class C {

    void test() {
        A a = new A();
        // 다른 패키지 불가능
//        new A(10); // protected
//        new A(5.5); // default

//        a.f1 = 10; a.f2 = 30;
//        a.m1(); a.m2();
    }
}
  • 다른 패키지이지만 상속받는 자식인 D클래스는 접근 가능
package day08.protec.pac2;

import day08.protec.pac1.A;

public class D extends A {

    D() {
        // 다른패키지에서 상속받는 자식은 접근가능 (protected)
        super(5);

        f1 = 100; // protected
//        f2 = 200; // default

        m1();
//        m2();
        }
    void test() {
        A a = new A();
//        f1 = 10; f2 = 30;
//        m1(); m2();
    }
}

protected 정리

  • 같은 패키지안에서 O
  • 다른 패키지이지만 상속받는 자식이면 O
  • 그 외에는 모두 X

사용 제한자 final

final을 해석하면 ‘마지막’ 이라는 뜻이다. 즉, final 키워드가 붙으면 수정이 불가능한 것을 의미
필드, 메서드, 클래스, 지역변수에 선언이 가능!!!

  • 마지막 필드와 지역변수 → 더 이상 값의 변경은 없다.
  • 마지막 메서드 → 더 이상 재 정의는 없다.
  • 마지막 클래스 → 더 이상의 개념의 확장은 없다

final 필드

  • final 필드를 선언하고 값을 반드시 초기화 해야한다. 초기화 방법에는
  1. 직접 초기화
  2. 생성자로 초기화
public class Person {
	
	final String nation; // 에러
	String name;
	int age;

}

public class Person {
	
	final String nation = "대한민국"; // O
	String name;
	int age;

}
  • 직접 초기화해주는 방법 말고도 생성자를 이용해서 초기화 도 가능
  • 생성자로 초기화 하기전에 변수를 수정할 수 있으므로 지역변수에도 final을 걸어준다.
public class Person {
	
	final String nation = "대한민국"; 
	final String name;
	int age;

	//생성자를 이용해서 초기화.
	public Person(final String name) {
    //        name = "김요한"; // 이럴 수도 있기 때문에 지역변수에 final
		this.name = name;
	}
}
  • final이 붙은 필드는 변경하려고하면 에러 발생
public class Main {
	
	Person p = new Person("김철수");
	p.nation = "미국"; //에러
	p.name = "김마이클"; //에러
}

final 메서드

  • final이 붙은 메서드는 오버라이딩을 막는다. (재정의 불가능)
public class Parent {

	void method1() {}
	void method2() {}
	final void method3() {}

}
public class Child extends Parent {

	@Override
	void method1() {
		// TODO Auto-generated method stub
		super.method1();
	}

	@Override
	void method2() {
		// TODO Auto-generated method stub
		super.method2();
	}

//	void method3() {
//		System.out.println("오버라이딩 해야지~");
//	} (x) final 메서드는 오버라이딩을 막습니다. (주는 대로 써라~)

}

final 클래스

  • 클래스 선언 시 final이 붙으면 그 클래스는 상속이 불가능
    -> 즉, final 클래스는 자식 클래스를 가질 수 없고, 오직 외부에서 직접 객체 생성을 통해서만 사용할 수 있다.

상수 (constant)

  • 고정된 불변의 값
  • 모든 객체가 해당 값을 공유할 수 있는 전역성을 가져야 하며, 동시에 값이 변하지 않는 불변성 또한 가져야 한다.
  • 한마디로 static과 final의 성질을 둘 다 가져야 한다.
  • 보통 대문자로 입력한다.
public class Earth {
	static final double RADIUS = 6400;
	
	static final double SURFACE_AREA;
	
	static {
		SURFACE_AREA = RADIUS * RADIUS * Math.PI * 4;
	}
}

열거형 enum

고정된 상수들을 모아 관리할 수 있게하는 자료형

열거형 기본구조

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}

열거형 고급 기능

  • 필드, 메서드 및 생성자 추가가 가능하다.
    -> 지정된 값으로 초기화 할 수 있다.
  • 필드, 생성자를 정의하고 상수에 필드에 해당하는 값을 넣어서 그 값을 getter 메서드를 통해 내보낼 수 있다.
  • enum
package day08.enum_;

public enum PizzaStatus {

    ORDERED("주문 완료", 5),
    READY("주문 완료", 20),
    DELIVERED("배달 완료", 30);

    private String description; // 설명
    private int timeToSetup; // 소요 시간

    PizzaStatus(String description, int timeToSetup) {
        this.description = description;
        this.timeToSetup = timeToSetup;
    }

    public String getDescription() {
        return description;
    }

    public int getTimeToSetup() {
        return timeToSetup;
    }
}
  • 상수들을 불러와서 기능 구현
package day08.enum_;

public class Pizza {

    private String pizzaName; // 피자 이름
    private PizzaStatus status; // 주문완료, 요리완료, 배달완료

    // 피자 주문 기능
    public void orderPizza() {
        this.status = PizzaStatus.ORDERED;
        System.out.println("피자 주문이 들어왔습니다.");
    }

    // 피자 준비 완료 기능
    public void readyPizza() {
        if (this.status == PizzaStatus.ORDERED) {
            this.status = PizzaStatus.READY;
            System.out.println("피자가 준비되었습니다.");
        } else {
            System.out.println("피자 주문이 없습니다.");
        }
    }

    // 피자 배달 기능
    public void deliverPizza() {
        if (this.status == PizzaStatus.READY) {
            this.status = PizzaStatus.DELIVERED;
            System.out.println("피자가 배달되었습니다.");
        } else {
            System.out.println("피자가 아직 요리중입니다.");
        }
    }

    public PizzaStatus getStatus() {
        return status;
    }
}
  • main
package day08.enum_;

public class Main {

    public static void main(String[] args) {

        Pizza pizza = new Pizza();

        pizza.orderPizza();
//        pizza.readyPizza();
//        pizza.deliverPizza();

		// 설명
        System.out.println("pizza.getStatus() = " + pizza.getStatus().getDescription());
        // 소요 시간
        System.out.println("소요 시간: " + pizza.getStatus().getTimeToSetup());
    }
}
profile
백엔드 개발자
post-custom-banner

0개의 댓글