> final
final 변경 금지의 규제
클래스, 메소드, 변수에 적용
abstract와 동시 사용 불가
1. fianl 클래스 - 상속 불가
오직 객체 생성을 통해 사용됨
ex. String 클래스
2. final 메소드 - 오버라이딩 불가
자식클래스에서 참조는 가능 (해당 클래스에 final이 없으면 상속 가능하므로)
//final 클래스 상속 불가능, final 메소드 오버라이딩 불가능
//Parent 클래스
public final class Parent { //final 클래스
public final void method1() { //final 메소드
System.out.println("부모클래스의 메소드");
}
}
//Child 클래스
public class Child extends Parent { //상속 불가능
public void method1() { //오버라이딩 불가능
System.out.println("오버라이딩");
}
}
//final 메소드 오버라이딩하지 않으면 자식클래스에서 참조 가능
//Parent 클래스
public class Parent {
public final void method1() {
System.out.println("부모클래스의 final 메소드");
}
}
//Child 클래스
public class Child extends Parent {
public final void method2() {
System.out.println("자식클래스의 고유한 메소드, final 메소드");
}
}
//main 클래스
public class MainClass {
public static void main(String[] args) }
\
Child a = new Child(); //자식클래스 객체생성
a.method1(); //부모클래스에서 상속받은 메소드
a.method2(); //자식클래스의 고유한 메소드
}
}
//부모클래스의 final 메소드
//자식클래스의 고유한 메소드, final 메소드
3. final 변수 - 값 변경 불가
선언 시 초기화 or 생성자를 통해 초기화 (초기화하지 않으면 에러)
//person 클래스
public class Person {
public final String nation = "대한민국"; //final 변수 - 선언 시 초기화
public final String num; //final 변수 - 아래 생성자를 통해 초기화
public String name;
public Person(String num, String name) { //생성자 - 매개변수 받아서 멤버변수에 저장
this.num = num;
this.name = name;
}
}
//main 클래스
public class MainClass {
public static void main(String[] args) {
Person kim = new Person("11111", "김민지"); //객체생성
kim.name = "김민수";
kim.nation = "미국"; //에러 - "대한민국"에서 바뀔 수 없음
kim.num = "12345"; //에러 - "11111"에서 바뀔 수 없음
}
}
* 상수 static final
불변의 값을 저장하는 필드
이름은 모두 대문자로 작성하되, 단어는_로 연결 (ex. NUMBER_ONE)
//Table 클래스
public class Table {
public static final double PI = 3.14;
public static final int EARTH_RADIUS = 6400;
}
//main 클래스
public class MainClass {
public static void main(String[] args) {
System.out.println(Table.PI);
System.out.println(Table.EARTH_RADIUS); //정적변수이므로 객체생성없이 클래스명.변수명으로 참조가능
}
}
//3.14
//6400
> abstract 추상
클래스, 메소드에 적용
1. abstract 클래스
클래스의 메소드 이름을 통일하기위해 사용
일반 클래스와 마찬가지로 멤버변수, 메소드, 생성자 선언 가능
오직 상속을 통해 자식클래스로 구체화 (new 키워드를 이용해 객체생성 못함)
→ 추상클래스에 생성자가 있어야 하며, 자식클래스에서 super()를 호출
자바의 많은 클래스가 abstract 클래스로 정의되어있음
2. abstract 메소드
abstract 클래스 내에서만 선언 가능
메소드의 선언부만 존재, 중괄호{ 실행내용 } 없음 - 자식클래스에서 반드시 오버라이딩 하여 실행내용 채워야 함
//부모클래스
public abstract class Parent { //추상클래스
private int x;
private int y; //private 멤버변수
public Parent() { //기본생성자(의미없음)
}
public Parent(int x, int y) { //생성자 - 멤버변수 초기화
this.x = x;
this.y = y;
}
public abstract double getArea(); //추상메소드 - 실행내용없음 (추상클래스이므로 선언가능)
public String position() { //메소드
return x + ", " + y;
}
}
//자식클래스
public class Child extends Parent {
private int radius; //radius 변수 생성
public Child(int r) { //생성자 - x와 y는 0, radius에는 r저장
this(0, 0, r);
}
public Child(int x, int y, int r) { //생성자 - x, y, radius 값 저장
super(x, y); //부모클래스 생성자 호출
radius = r;
}
public double getArea() { //부모클래스의 추상메소드 오버라이딩
return (Math.PI * radius * radius); //원의 넓이 반환
}
}
//main 클래스
public class MainClass {
public static void main(String[] args) {
Parent circle = new Child(10); //다형성 - 자식클래스로 생성해 부모클래스로 저장
System.out.println("원의 넓이: " + circle.getArea()); //부모클래스 기능만 사용가능
System.out.println("도형의 위치: " + circle.position());
}
}
//314.1592...
//0, 0
'course 2021 > JAVA' 카테고리의 다른 글
day17 - exception (0) | 2021.09.11 |
---|---|
day16 - interface (0) | 2021.09.08 |
day14 - static (0) | 2021.09.07 |
day13 - polymorphism (0) | 2021.09.05 |
day12 - access modifier, encapsulation (0) | 2021.09.02 |