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;
}