본문 바로가기
Programming/Java

[JAVA] Final 과 Abstract(추상화)

by 공부합시다홍아 2023. 11. 30.
 

[JAVA] SingleTon Design Pattern

[JAVA] 정적 제한자 Static [JAVA] 다형성 [JAVA] 접근 제한자 [JAVA] 패키지와 상속 [JAVA] 객체와 클래스 [JAVA] 스택(Stack)과 큐(Queue) [JAVA] 매서드 [JAVA] 2차원 배열 [JAVA] 배열을 이용한 문제풀이 [JAVA] 정렬과

hong-study.tistory.com


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