2022/2/16
static:
모두가 공유하고 일정하게 보존된 데이터가 필요할 때 static으로 만든다.
static 메서드는 객체 생성 없이 바로 사용 가능.-> static 메서드는 static 멤버만 접근 가능 (인스턴스 x) -> static메서드에서 this 키워드 사용할 수 없다. (this는 new를 해야 생기기 때문에 new 없이 사용하는 static에서는 사용 불가)
final:
1. final 클래스: 클래스 앞에 final이 붙으면, 상속할 수 없음을 지정함 -> 부모가 될 수 없다.
fainal class FinalClass {}
2. final 메서드: 메서드 앞에 붙으면, 오버 라이딩을 할 수 없음을 선언함.
final int finalMethod(){…}
3. final 변수: 변수 앞에 붙으면, 상수가 된다. 상수는 한번 초기화가 되면 값을 변경할 수 없다.
final int row 10; // 상수 선언
row = 20; //불가능! 하지만 이렇게 할 경우 상수인지 변수인지 모름. 그래서 관례적으로 전부 대문자로 만들어줌.
final in ROW = 10; 이렇게.
public static final double PI = 3.14…;
상속 inheritance
1. 클래스와 클래스 사이 (1:1)의 부모 자식 관계를 만드는 것.
2. 자바는 다중 상속이 안됨.
3. 상속은 부모의 변수, 메서드를 물려받는 것.
4. 상속 시, 생성자와 초기화 블록은 제외. 그렇다고 해서 부모의 생성자를 못 쓰는 건 아니고 쓸 수 있다...... 물려받지만 않는 것.
5. 상속 키워드: extends
6. 상속을 받으면 부모의 멤버들을 자식이 담게 된다. -> 자식은 부모의 것과 함께 자식만의 변수와 메서드를 갖게 된다.
7. 필요한 이유: 코드 중복을 제거, 유지보수 편함, 소프트웨어 생산성 향상.
부모 클래스 = super, parent, base
자식 클래스 = sub, child, derived
class Object {} //조상님.
class Parent {} //할머니: x
class Child extends Parent {} //엄마: x(상속), y (자기 꺼)
class GrandChild extends Child {} //딸: x, y (상속), z (자기 꺼) <- 이렇게 하면 Parent, Child 전부 포함하여 상속 가능.
8. Object 클래스: 모든 클래스의 조상. 오브젝트 클래스의 멤버를 모두 사용할 수 있다.
9. Package: 프로그램에서 폴더/ 디렉터리를 말한다. 보통 패키지는 3 수준까지 내려가는 폴더 이름을 작성. ex) java.awt.color. 클래스
10.java.lang: 자바 표준 API에서 가장 기본적인 package
상속과 접근 제어자
1. 슈퍼 클래스의 private 멤버: 서브 클래스 포함 다른 클래스에서 접근 x
2. 슈퍼 클래스의 default 멤버: 서브 클래스라도 다른 패키지면 접근 x
3. 슈퍼 클래스의 public 멤버: 모두 접근 가능
4. 슈퍼 클래스의 protected 멤버: 같은 패키지의 모든 클래스 접근 가능. 패키지 상관없이 서브 클래스 접근 가능.
상속과 생성자
1. 서브와 슈퍼 클래스의 생성자 호출 및 실행: 서브 클래스와 슈퍼 클래스 두 개 생성자 모두 실행됨. 슈퍼 생성자 먼저 실행 후 서브 생성자 실행.
2. 서브 클래스에서 슈퍼 클래스 생성자 선택.
슈퍼 클래스의 생성자가 여러 개 있는 경우, 개발자가 자식 생성자에서 특정 부모 생성자를 명시적으로 지정하지 않은 경우, 부모의 기본 생성자를 자동으로 실행시킨다.
① 슈퍼 클래스의 기본 생성자가 자동으로 선택되는 경우의 문제: 부모가 기본 생성자는 없고, 매개변수 있는 생성자만 있다면 에러 발생! 기본 생성자가 없는 부모 클래스를 상속 받을 경우, 자식 클래스에서 부모 클래스의 매개 변수 가진 생성자에게 값을 던져주는 super(인자)가 있어야 한다. 또는, 부모 클래스에 기본 생성자를 만들어야 함.
② 부모의 생성자를 개발자가 명시해서 실행하고 싶을 경우 super();를 이용하여 선택해줄 수 있다.
super(): 부모 클래스의 생성자를 호출해주는 명령어. 자식 생성자 안에서 사용 가능하고, 첫 번째 명령문이어야 한다. this랑 super랑 동시에 쓸 수 없다~!
오버 라이딩 Overriding
1. 클래스 상속 관계에서 성립
2. 재작성, 덮어 씌우기, 재정의한다. -> 부모 클래스의 메서드가 맘에 안 들어 내용을 변경해서 사용하는 것
3. 메서드 선언부는 똑같이, 영역{} 안 내용만 바꾸는 것
4. 오버로드와 완전히 다름.
오버 라이딩은 내용을 변경해서 덮어 씌우는 형태
오버 로딩은 새로운 메서드를 만드는 것.
5. 동적 바인딩: 서브에 오버 라이딩 메서드가 있으면 슈퍼 클래스의 메서드를 무시하고, 서브 클래스에서 오버 라이딩된 메서드가 무조건 실행되도록 하는 것.
6. super(연산자임…): 슈퍼 클래스에 대한 래퍼런스.
super. 메서드명() 내가 오버 라이딩한 거 말고 슈퍼 클래스에 있는 거 쓰고 싶으면 이렇게. 서브 클래스에 메서드 오버 라이딩 시, 동적 바인딩으로 오버 라이딩된 메서드가 자동으로 호출되는데, 슈퍼클래스의 멤버를 호출하고자 할 때 사용되는 키워드.
this: 자기 자신 객체
this(): 내 생성자 안에서 나의 다른 생성자 호출
super: 부모의~ 부모가 가진~
super(): 부모의 생성자 호출
--
생성자, 매서드, 초기화 블록의 구조가 헷갈리기 시작한다...