final

Mia Lee·2022년 1월 3일
0

JAVA

목록 보기
83/98
package ex_final;

public class Ex1 {

	public static void main(String[] args) {

		/*
		 * final 키워드
		 * - 클래스, 메서드, 멤버변수에 지정 가능
		 * 
		 * 1) 멤버변수에 final이 붙을 경우
		 *   - 기본 문법 : final 데이터타입 변수명;
		 *   - ex) 원주율 계산을 위한 파이(PI)값은 변경되면 안되므로 변수에 final 표기
		 *   
		 * 2) 메서드에 final이 붙을 경우
		 *   - 기본 문법 : [접근제한자] final 리턴타입 메서드명([매개변수...) {}
		 *   
		 * 3) 클래스에 final이 붙을 경우
		 *   - 기본 문법 : [접근제한자] final class 클래스명 {}
		 *   - 어떤 클래스 자체로 이미 완전한 클래스 기능을 수행하는 경우 상속을 금지시킴
		 *     ex) String 클래스, Math 클래스 등
		 *   - final 메서드보다 더 광범위한 제한을 두도록 할 때 사용
		 *   
		 */
		
		// final 멤버변수
		FinalMemberVariable fmv = new FinalMemberVariable();
		
		// 멤버변수 값 변경
		fmv.normalVariable = 99;
//		fmv.finalVarialbe = 999; // 오류 발생! final로 선언된 멤버변수 값 변경 불가!
		
		System.out.println(fmv.normalVariable);
		System.out.println(fmv.finalVariable); // 상수값을 사용하는 것은 가능!
		
		// final 메서드
		SubClassFinalMethod scfm = new SubClassFinalMethod();
		scfm.normalMethod(); // 일반메서드
		scfm.finalMethod(); // final 메서드
		// => 부모의 finalMethod() 호출!
		// => final 메서드는 오버라이딩이 불가능할 뿐 사용하는 것은 가능!
		
		// final 클래스
		FinalClass fc = new FinalClass(); // 인스턴스 생성 가능!
		
	}

}

// ----- final 멤버변수 -----
class FinalMemberVariable {
	
	int normalVariable = 10;
	final int finalVariable = 20; // final 멤버변수 = 상수 = 값 변경 불가
	// => 변수에 접근하여 값을 사용할 수는 있으나, 값을 변경할 수는 없다!
	
	final int finalVariable2; // 에러 발생! final 멤버변수는 초기화가 동시에 선언!
	// => 만약, 변수 선언 시 초기화를 안할 경우 생성자에서 초기화 가능!
	
	public FinalMemberVariable() {
		finalVariable2 = 30; // final 멤버변수 초기화를 생략 시 컴파일 에러 발생!
		
	}
	
}

// ----- final 메서드 -----
class FinalMethod {
	
	// 일반 메서드
	public void normalMethod() {
		System.out.println("FinalMethod의 normalMethod()");
		
	}
	
	// final 메서드
	public final void finalMethod() {
		System.out.println("FinalMethod의 finalMethod()");
		
	}
	
}

class SubClassFinalMethod extends FinalMethod {
	
	@Override
	public void normalMethod() {
		System.out.println("서브클래스에서 오버라이딩 된 normalMethod()");
		
		// final 메서드를 호출하는 것은 가능!
		finalMethod();
		
	}
	
//	@Override
//	public void finalMethod() {
//		// 오류 발생! final 메서드는 서브클래스에서 오버라이딩 불가!
//		
//	}
	
} // SubClassFinalMethod 클래스 끝

// ----- final 클래스 -----
final class FinalClass {}

//class SubClassFinalClass extends FinalClass {
//	// 오류 발생! final 클래스는 상속 불가!
//	
//}

class OtherClass {
	
	// final 클래스는 상속(is-a관계)은 불가능하나
	// 포함(has-a)은 가능!
	FinalClass fc = new FinalClass(); // 인스턴스 생성을 통한 접근은 가능!
	
}

// final 클래스의 대표적인 예 : String 클래스
//class OtherClass2 extends String {} // 상속 불가!














package ex_final;

public class Ex2 {

	public static void main(String[] args) {

		System.out.println("지구 반지름 : " + Earth.EARTH_RADIUS + " km");
		System.out.println("지구 표면적 : " + Earth.EARTH_AREA + " km^2");
		
		System.out.println("==============================================");
		
		/*
		 * 어떤 클래스에 데이터를 저장한 후 해당 데이터를 판별해야하는 경우
		 * 데이터에 대한 문자열이나 정수 데이터 비교 시 비교 데이터를 잘못 지정하거나,
		 * 데이터 저장 시 잘못 저장할 경우로 인해 실제 비교할 때 올바른 비교가 수행되지 않을 수 있다!
		 * 
		 */
		
		Car car = new Car();
		car.setCompany("HYUNDAI");
		car.setModel("SONATA");
		car.setColor("RED");
		
//		if(car.getCompany().equals("hyundai")) {
		if(car.getCompany().equalsIgnoreCase("hyundai")) {
			// 대문자 HYUNDAI와 소문자 hyundai는 다른 문자열로 취급됨
			// => equalsIgnoreCase() 메서드를 호출하면 해결 가능!
			System.out.println("현대 자동차!");
			
		} else {
			System.out.println("타사 자동차!");
			
		}
		
		if(car.getModel().equals("쏘나타")) {
			// SONATA와 쏘나타는 다른 문자열이며 다른 차종으로 취급!
			// => equalsIgnoreCase() 메서드를 호출해도 해결 불가능!
			System.out.println("쏘나타네요!");
			
		} else {
			System.out.println("쏘나타가 아니네요!");
			
		}
		
		System.out.println("======================================================");
		
		/*
		 * 클래스에서 상수를 통해 사용될 데이터를 제공하는 경우
		 * - 사용자 입장에서 데이터 사용 시 오타 등의 위험을 줄이고
		 *   상수명만으로 해당 데이터의 실제 내용을 몰라도 사용 가능하므로 편의성 및
		 *   코드의 안정성, 유지보수성이 증대!
		 */
		
		Car2 car2 = new Car2();
//		car2.setCompany("HYUNDAI");
		car2.setCompany(Car2.COMPANY_KIA);
		car2.setModel(Car2.MODEL_SONATA);
		car2.setColor(Car2.COLOR_PERFECT_BLACK);
		
		if (car2.getCompany().equals(Car2.COMPANY_HYUNDAI)) {
			System.out.println("현대 자동차!");
		} else if(car2.getCompany().equals(Car2.COMPANY_KIA)) {
			System.out.println("기아 자동차!");
		}
		
		if (car2.getModel().equals(Car2.MODEL_SONATA)) {
			System.out.println("쏘나타네요!");
		} else if (car2.getModel().equals(Car2.MODEL_TUCSON)) {
			System.out.println("투싼이네요!");
		}
		
		if (car2.getColor() == Car2.COLOR_BARCELONA_RED) {
			System.out.println("빨간색이네요!");
		} else if(car2.getColor() == Car2.COLOR_PERFECT_BLACK) {
			System.out.println("검은색이네요!");
		}
		
	}

}

class Car2 {
	
	// 상수를 사용하여 데이터를 관리하는 경우
	private String company;
	private String model;
	private int color;
	
	// 데이터 저장에 필요한 값들을 상수로 미리 선언해둠
	// => 이 때, 상수명을 최대한 식별이 용이하도록 관련있는 이름으로 지정
	public static final String COMPANY_HYUNDAI = "현대자동차";
	public static final String COMPANY_KIA = "기아자동차";
	
	public static final String MODEL_SONATA = "SONATA";
	public static final String MODEL_TUCSON = "TUCSON";
	
	public static final int COLOR_PERFECT_BLACK = 0x000000;
	public static final int COLOR_BARCELONA_RED = 0xFF0000;
	
	public String getCompany() {
		return company;
	}
	public void setCompany(String company) {
		this.company = company;
	}
	public String getModel() {
		return model;
	}
	public void setModel(String model) {
		this.model = model;
	}
	public int getColor() {
		return color;
	}
	public void setColor(int color) {
		this.color = color;
	}
	
}

class Car {
	// 상수를 사용하지 않고 데이터를 관리하는 경우
	private String company;
	private String model;
	private String color;
	
	// Getter / Setter 정의
	public String getCompany() {
		return company;
	}
	public void setCompany(String company) {
		this.company = company;
	}
	public String getModel() {
		return model;
	}
	public void setModel(String model) {
		this.model = model;
	}
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	
}


class Earth {
	
	// 상수 선언
	// 상수는 보통 이름을 대문자로 선언(단어 사이 구분은 _ 기호를 사용)
	public static final double EARTH_RADIUS = 6400;
	public static final double EARTH_AREA = 4 * Math.PI * EARTH_RADIUS * EARTH_RADIUS;
	
}

0개의 댓글