끄적끄적 코딩

객체지향 언어의 특징

추상화(Abstraction) 현실의 객체를 추상화 해서 클래스를 구성
다형성(Polymorphism) 하나의 객체를 여러 가지 타입(형)으로 참조할 수 있음
상속(Inheritance) 부모 클래스의 자산을 물려받아 자식을 정의함으로 코드의 재사용이 가능
데이터 은닉과 보호(Encapsulation) 데이터를 외부에 직접 노출시키지 않고 메서드를 이용해서 보호할 수 있음

상속
기존 클래스의 자산 멤버을 자식 클래스에서 재사용하기 위한 것
- 부모의 생성자와 초기화 블록은 상속하지 않음
기존 클래스의 멤버를 물려 받기 때문에 코드의 절감
- 부모의 코드를 변경하면 모든 자식들에게도 적용 -> 유지 보수성 향상
상속의 적용
- extend 키워드 사용

Object 클래스
모든 클래스의 조상 클래스
  별도의 extends 선언이 없는 클래스들은 extends Object가 생략됨
  따라서 모든 클래스에는 Object 클래스에 정의된 메서드가 있음

단일 상속
다중 상속의 경우 여러 클래스의 기능을 물려받을 수 있으나 관계가 매우 복잡해짐
- 동일한 이름의 메서드가 두 부모에게 있다면?
자바는 단일 상속만 지원 대신 Interface와 포함 관계(has a)로 극복

포함 관계
상속 이외에 클래스를 재활용 하는 방법

메서드 오버라이딩
조상 클래스에 정의된 메서드를 자식 클래스에서 적합하게 수정하는 것

오버라이딩 조건
1. 메서드 이름이 같아야 한다
2. 매개 변수의 개수, 타입, 순서가 같아야 한다.
3. 리턴 타입이 같아야 한다.
4. 접근 제한자는 부모 보다 범위가 넓거나 같아야 한다.
5. 조상보다 더 큰 예외를 던질 수 없다.

Annotation
컴파일러, JVM, 프레임워크 등이 보는 주석
소스코드에 메타 데이터를 삽입하는 형태

@Deprecated
- 컴파일러에게 해당 메서드가 deprecated 되었다고 알려줌

@Override
- 컴파일러에게 해당 메서드는 override한 메서드 임을 알려줌
- @Override가 선언된 경우 반드시 super class에 선언 되어있는 메서드 여야 함

@SupperessWarnings
- 컴파일러에게 사소한 warning의 경우 신경 쓰지 말라고 알려줌

toString 메서드
메서드 객체를 문자열로 변경하는 메서드

equals 메서드
두 객체가 같은지를 비교하는 메서드
객체의 주소 비교 : ==
객체의 내용 비교 : equals

hashCode
객체의 해시 코드 : 시스템에서 객체를 구별하기 위해 사용되는 정수 값
HashSet, HashMap 등에서 객체의 동일성을 확인하기 위해 사용
equals 메서드를 재정의 할 때는 반드시 hashCode도 재정의 할 것
- 미리 작성된 String이나 Number 등에서 재정의된 hashCode 활용 권장

super 키워드
this통해 멤버에 접근했듯이 super를 통해 조상 클래스 멤버 접근
super.을 이용해 조상의 메서드 호출로 조상의 코드 재사용

super.jump();
void jump() { 
  if(this.isSpider){ 
    this.spider.jump(); 
  } else { 
    super.jump(); 
  } 
}

변수의 scope
- 사용된 위치에서 점점 확장해가며 처음 만난 선언부에 연결됨
- method 내부 -> 해당 클래스 멤버 변수 -> 조상 클래스 멤버 변수

this()가 해당 클래스의 다른 생성자를 호출하듯 super()는 조상 클래스의 생성자 호출
- 조상 클래스에 선언된 멤버들은 조상 클래스의 생성자에서 초기화가 이뤄지므로 이를 재활용
- 자식 클래스에 선언된 멤버들만 자식 클래스 생성자에서 초기화
super()는 자식 클래스 생성자의 맨 첫 줄에서만 호출 가능
- 즉 생성자의 첫 줄에만 this() 또는 super()가 올 수 있다.
명시적으로 this() 또는 super()를 호출하지 않는 경우 컴파일러가 super() 삽입
- 결론적으로 맨 상위의 Object까지 객체가 다 만들어지는 구조


package
PC의 많은 파일 관리 -> 폴더 이용
- 유사한 목적의 파일을 기준으로 작성
- 이름은 의미 있는 이름으로, 계층적 접근
프로그램의 많은 클래스 -> 패키지 이용
- 패키지의 이름은 의미 있는 이름으로 만들고 .를 통해 계층적 접근
- 물리적으로 패키지는 클래스 파일을 담고 있는 디렉터리
- package name + class name으로 클래스 구분 -> fully qualified name
package의 선언
- package package_name;
- 주석 공백을 제외한 첫 번째 문장에 하나의 패키지만 선언
- 모든 클래스는 반드시 하나의 패키지에 속함

import
다른 패키지에 선언된 클래스를 사용하기 위해 키워드
- 패키지와 클래스 선언 사이에 위치
- 패키지와 달리 여러 번 선언 가능
선언 방법
- import 패키지명.클래스명;
- import 패키지명.*;
import한 package의 클래스 이름이 동일하여 명확히 구분해야 할 때
- 클래스 이름 앞에 전체 패키지 명을 입력
default import package
- java.lang.*;


일반적인 클래스 레이아웃
package structure; // 패키지 선언부
import java.io.*; // 외부 패키지
import public class ClassStructure { // class 선언부
  String name; // 멤버 변수 int age;
  {name="andy";} // 초기화 블록 
  public ClassStructure(String name, int age) { // 생성자
    this.name = name;
    this.age = age; 
  }
  public void setName(String name) { // 멤버 메서드
    this.name = name;
  }
  public static void main(String [] args) {
    ClassStructure cs = new ClassStructure("Lee", 10);
  }
}

제한자 (modifier)
클래스, 변수, 메서드 선언부에 함께 사용되어 부가적인 의미 부여
종류
- 접근 제한자 : public, protected, (default = package), private
- 그 외 제한자
    static : 클래스 레벨의 요소 설정
    final : 요소를 더 이상 수정할 수 없게 함
    abstract : 추상 메서드 및 추상 클래스 작성
    synchronized : 멀티 스레드에서의 동기화 처리
하나의 대상에 여러 제한자를 조합 가능하나 접근 제한자는 하나만 사용 가능
순서는 무관

final
마지막, 더 이상 바뀔 수 없음
용도
- final class  더 이상 확장 할 수 없음 : 상속 금지 -> 오버라이드 방지
- final method  더 이상 재 정의 할 수 없음 : overriding 금지
- final variable 더 이상 값을 바꿀 수 없음
- Blank final  값이 할당되지 않은 멤버 변수
- static final 상수

접근 제한자
멤버 등에 사용되며 해당 요소를 외부에서 사용할 수 있는지 설정
public 용도(클래스, 생성자, 멤버) 접근 가능 범위(같은 클래스, 같은 패키지, 다른 패키지의 자손 클래스, 전체)
protected 용도(생성자, 멤버) 접근 가능 범위(같은 클래스, 같은 패키지, 다른 패키지의 자손 클래스)
package(default) 용도(클래스, 생성자, 멤버) 접근 가능 범위(같은 클래스, 같은 패키지, 다른 패키지)
private 용도(생성자, 멤버) 접근 가능 범위(같은 클래스)

 

검색 태그