Final ( 변경 금지의 규제 )
- final 키워드는 클래스, 메서드, 변수에 적용되며 abstract와 동시에 사용할 수 없다.
- final 클래스의 경우에는 상속이 안된다. 즉, 서브 클래스를 가질 수 없다.
- final 메서드는 재정의를 할 수 없다.
- final 변수는 값을 변경할 수 없다.
※ 쉽게 설명하자면, 아무도 건들 수 없도록 만들어 준다고 생각하면 된다.
Final class
- 클래스 선언시 final을 사용하면 해당 클래스는 상속이 불가하다.
- final 클래스는 자식 클래스를 가질 수 없고, 오직 외부에서 객체 생성을 통해서만 사용 가능하다.
- final 클래스의 대표적인 예가 String 클래스이다.
▶ 사용자가 임의로 String 클래스를 상속받아 메서드를 재정의하는 것을 방지하기 위한 것이다.
부모클래스
public /*final*/ class Parent { //상속금지
public void method01() {
}
//오버라이딩 금지
public final void method02() {
}
}
자식클래스
public class Child extends Parent{
public void method01() {
System.out.println("오버라이된 메서드");
}
// public void method02() {
// }
}
Final 변수(Variable)
- final 변수는 한번 값을 할당하면 그 값을 변경할 수 없다.
- final 변수는 선언시 초기화하는 방법과 생성자를 통해 초기화하는 두 가지 방법이 있다.
▶ 다만, 초기화하지 않고 남겨둘 시, 컴파일 에러가 발생한다.
- Constant.class
public class Constant {
public static final double PI = 3.14;
public static final int O2 = 32;
public static final long EARTH_RADIUS = 6400L;
}
- Person.Class
public class Person {
//final이 변수에 붙는경우 (변경금지)
//final변수는 반드시 초기화가 진행되어야 합니다.
public final String nation = "대한민국";
public final String ssn; //주민번호
public String name; //이름
public Person(String ssn, String name) {
this.ssn = ssn;
this.name = name;
}
}
- Main.class
public class MainClass {
public static void main(String[] args) {
Person p1 = new Person("123123", "홍길동");
//p1.ssn = "234234"; //변경금지
Person p2 = new Person("345345", "이순신");
//객체마다 다른값을 가질수는 있음
System.out.println(p1.ssn); //123123
System.out.println(p2.ssn); //345345
final int a = 1;
System.out.println("------------------");
System.out.println( Constant.PI );
System.out.println( Math.PI );
}
}
static 과 final이 동시에 붙으면 상수이다.
상수 ( static final )
- 자바에서는 불변의 값을 저장하는 필드를 상수(Constant)라고 부른다.
- 위 예시의 Constant.class에 저장된 변수가 이와 같은 케이스이다.
- 상수는 객체마다 저장할 필요가 없는 공용성을 가져야하며, 여러가지 값으로 초기화될 수 없다.
- static과 final 제한자를 동시에 붙여 선언한다.
- 상수 이름은 모두 대문자로 작성하는 것이 관례이다. 연결된 단어라면 (_)로 단어들을 연결한다.
추상화 ( Abstract )
- abstract 키워드는 클래스와 메서드에 적용된다.
- 추상클래스는 실체 클래스들의 메서들의 이름을 통일할 목적으로 사용
- 추상 메서드가 있는 클래스는 반드시 추상 클래스여야 합니다.
- 추상 클래스에는 반드시 추상메서드만 선언할 필요는 없고 일반 메서드도 선언이 가능하다.
추상 클래스 ( Abstract Class )
- 추상클래스는 new 키워드를 이용해서 객체를 만들지 못하고 오직 상속을 통해서 자식 클래스로 구체화해야 한다.
- 추상 클래스도 일반클래스와 마찬가지로 멤버변수, 생성자, 메서드를 선언할 수 있다.
- new 를 사용하여 직접 생성자를 호출할 수는 없지만 자식 객체가 생성될 때 super()를 호출하여
추상 클래스 객체를 생성하므로 추상클래스도 생성자가 반드시 있어야한다.
추상 메서드 ( Abstract Method )
- 추상 메서드는 추상 클래스 내에서만 선언 가능하다.
- 추상 메서드는 메서드의 선언부만 있고 메서드 실행 내용이 들어가는 중괄호()가 없는 메서드를 말한다.
- 추상 클래스 설계시 자식 클래스가 반드시 실행 내용을 채우도록 강요할 메서드가 있을 경우,
해당 메서드를 추상 메서드로 선언한다. - 자식 클래스에서 반드시 부모 추상 클래스의 추상 메서드를 재정의하여 실행 내용을 작성해야한다.
▶ 그렇게 하지 않은 경우, 컴파일 오류 발생
abstract를 사용하지 않는 경
부모클래스
public class Store {
//추상메서드를 쓰지 않는다면..?
public void apple() {
System.out.println("사과 가격은 지점에서 정합니다");
}
public void melon() {
System.out.println("멜론 가격은 지정에서 정합니다");
}
public void orange() {
System.out.println("오렌지 가격은 지정에서 정합니다");
}
}
자식클래스
public class SeoulStore extends Store {
//store는 어떤기능이 있는지 모른다면...
public void melon() {
System.out.println("서울에서 멜론가격은 500원 입니다");
}
public void orange() {
System.out.println("서울에서 오렌지가격은 600원 입니다");
}
//apple 오버라이딩을 해야하는데, 빼먹었다면...?
}
메인클래스
public class MainClass {
public static void main(String[] args) {
SeoulStore store = new SeoulStore(); //자식객체 생성
store.apple(); //apple은 반드시 오버라이딩 해야하는데, 잘못된 메서드 호출로 연결될 수 있다.
store.melon();
store.orange();
}
}
추상화 클래스를 사용하는 경우
부모클래스
public abstract class Store {
/*
* 추상클래스
* 1. 클래스에 abstract를 붙이면 추상클래스가 됩니다
* 2. 메서드에 abstract를 붙이면 추상메서드가 됩니다.
* 3. 추상메서드는 {}가 없는 메서드의 선언 입니다.
* 4. 추상메서드는 추상클래스에서만 선언이 가능합니다.(소울메이트)
* 5. 추상클래스도 생성자, 일반메서드, 멤버변수 모두 가질 수 있습니다
*/
private String name = "호식이 과일가게";
public Store() {
System.out.println("추상클래스의 생성자 호출됨");
}
public abstract void apple();
public abstract void melon();
public abstract void orange();
public final void mango() {//오버라이드 금지
System.out.println("본점에서 1000원 고정가격 입니다");
}
public String getName() {
return name;
}
}
자식클래스1
public class SeoulStore extends Store {
@Override
public void apple() {
System.out.println("서울의 사과는 500원 입니다");
}
@Override
public void melon() {
System.out.println("서울의 멜론은 600원 입니다");
}
@Override
public void orange() {
System.out.println("서울의 오렌지는 700원 입니다");
}
}
자식클래스2
public class BusanStore extends Store {
@Override
public void apple() {
System.out.println("부산지점 사과는 100원 입니다");
}
@Override
public void melon() {
System.out.println("부산지점 멜론은 200원 입니다");
}
@Override
public void orange() {
System.out.println("부산지점 오렌지는 300원 입니다");
}
}
메인클래스
public class MainClass {
public static void main(String[] args) {
/*
* 추상클래스를 사용하려면, 자식으로 생성해서 추상클래스 타입으로 구체화 시켜야됩니다.
*
* (객체의 추상화) 라고 부르기로 약속합시다.
*/
Store store = new SeoulStore();
store.apple();
store.melon();
store.orange();
store.mango();
System.out.println( store.getName() );
System.out.println("----------------------------------");
Store store2 = new BusanStore();
store2.apple();
store2.melon();
store2.orange();
store2.mango();
System.out.println( store2.getName() );
}
}
728x90
'Programming > Java' 카테고리의 다른 글
[JAVA] 예외 처리 (0) | 2023.12.01 |
---|---|
[JAVA] 인터페이스 (Interface) (0) | 2023.11.30 |
[JAVA] SingleTon Design Pattern (0) | 2023.11.30 |
[JAVA] 정적 제한자 Static (0) | 2023.11.30 |
[JAVA] 다형성 (1) | 2023.11.14 |