1일 1공 - Java 클래스

BANG·2021년 4월 28일
0

1일 1공

목록 보기
2/5

클래스

  • 객체는 설계도를 바탕으로 만들어짐
  • 설계도가 클래스
  • 객체를 생성하기 위한 필드와 메서드가 정의되어 있음
  • 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스라고 함
  • 클래스로부터 객체를 만드는 과정을 인스턴스화

클래스 선언

  • 첫 글자는 대문자

객체 생성과 클래스 변수

  • 클래스로부터 객체를 생성하는 방법은 new 연산자 사용
  • new 연산자로 생성된 객체(인스턴스)는 메모리 힙 영역에 생성됨
  • new 연산자는 객체를 생성하고, 객체의 주소를 반환

    클래스 변수명 = new 클래스();

클래스의 구성 멤버

필드(Field)

  • 클래스 멤버 변수라고도 불림
  • 객체의 고유 데이터를 저장하는 곳
  • 선언 형태는 변수와 비슷
  • 생성자와 메서드 전체에서 사용되며 객체가 소멸되지 않는 한 계속 존재
  • 클래스 중괄호 안에선 어디어 있어도 괜찮음(생성자, 메서드 안에는 안됨)
  • 도트 연산자(.)는 객체 접근 연산자로 객체가 가지고 있는 필드, 메서드를 사용할 때 사용
  • this는 객체 자신의 참조
  • 'this.필드'는 this란 참조변수로 필드를 사용하는 것과 동일

생성자(Constructor)

  • new 연산자로 호출되는 특별한 중괄호 블록
  • 객체 생성 시, 초기화를 담당
  • 메서드와 비슷하지만 클래스 이름으로 되어있고 리턴 타입이 없음
  • 모든 클래스는 생성자가 반드시 존재
  • 하나 이상을 가질 수 있음

기본 생성자

  • 클래스 내부에 생성자 선언을 생략하면 컴파일러가 기본 생성자를 자동 추가함
  • 클래스 내부에 명시적으로 생성자를 1개라도 선언하면 기본 생성자를 추가하지 않음

생성자 오버로딩

  • 다양한 방법으로 객체를 생성할 수 있도록 제공
  • 매개변수를 달리하는 생성자를 여러개 선언하는 것

다른 생성자 호출, this()

  • 필드 초기화는 한 생성자에게만 집중하고 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출
  • 생성자에서 다른 생성자를 호출할 때 사용
  • 생성자의 첫 줄에서만 허용
  • this()의 매개값은 호출되는 생성자의 매개 변수 타입에 맞게 제공

메서드(Method)

  • 객체의 동작에 해당하는 중괄호 블록
  • 객체 간의 데이터 전달의 수단으로 사용됨
  • 선언부와 실행블록으로 구성
  • 클래스 내부에선 메서드명으로 호출 가능
  • 클래스 외부에선 '변수명.메서드명' 호출

메서드 오버로딩

  • 클래스 내에 같은 이름의 메소드를 여러개 선언하는 것
  • 매개 변수의 타입, 개수, 순서 중 하나가 달라야 함

인스턴스 멤버와 this

  • 인스턴스 멤버란 객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메서드
  • 인스턴스 필드와 인스턴스 메서드

정적 멤버와 static

  • 정적 멤버는 클래스에 고장된 멤버
  • 객체를 생성하지 않고 사용할 수 있는 필드와 메서드
  • 정적 멤버는 객체가 아닌 클래스에 소속된 멤버

  • 클래스 멤버
    라고 함

정적 멤버 선언

  • 필드나 메서드 선언 시 static 키워드를 추가하면 됨
  • 객체마다 가지고 있을 필요성이 없는 공용적 데이터를 정적 필드로 선언
  • 인스턴스 필드를 이용하지 않는다면 정적 메서드로 선언

정적 멤버 사용

  • 클래스가 메모리에 로딩되면 바로 사용 가능

    클래스명.필드;
    클래스명.메서드();

  • 원칙적으로 클래스 이름으로 접근해야 하지만 객체 참조 변수로도 접근 가능

정적 초기화 블록

  • 정적 필드는 선언과 동시에 초기화하는 것이 보통
  • 정적 필드의 복잡한 초기화 작업을 위해 정적 블록(static block)을 제공
  • 정적 블록은 클래스가 메모리로 로딩될 때 자동으로 실행됨
  • 클래스 내부에 여러개가 선언되어도 상관없음

정적 메서드와 블록 선언 시 주의점

  • 객체가 없어도 실행됨
  • 내부에 인스턴스 필드나 메서드를 사용할 수 없음
    - 정적 메서드와 블럭에서 인스턴스 멤버를 사용하려면 객체를 먼저 생성하고 참조 변수로 접근
  • 객체 자신의 참조인 this 키워드 사용 불가능

싱글톤(Singleton)

  • 전체 프로그램에서 단 하나의 객체(싱글톤)만 만들도록 보장해야 할 경우
  • 싱글톤을 만드려면 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아야 함
    - 생성자를 호출한 만큼 객체가 생성되므로
  • 생성자 앞에 private 접근 제한자를 붙여주기
  • 클래스 내부에선 new 연산자로 생성자 호출 가능
public Class 클래스 {
    // 정적 필드
    private static 클래스 변수명 = new 클래스();
    
    // 생성자
    private 클래스() {}
    
    // 정적 메서드
    static 클래스 getInstance() {
    	return 변수명;
    }
    
}
  • 정적 필드를 선언하고 자신의 객체를 생성해 초기화
  • 정적 필드도 private 접근 제한자를 붙여 외부에서 필드값을 변경 못하게 막기
  • 외부에서 호출 가능한 메서드를 선언하여 정적 필드에서 참조하는 객체를 리턴
  • 외부에서 객체를 얻는 방법은 getInstance() 메서드 호출하는 방법뿐

final 필드와 상수

  • final은 최종적이란 뜻

final 필드

  • 초기값이 저장되면 이것이 최종적인 값이 되어 프로그램 실행 도중에 변경 불가

    final 타입 변수명 [= 초기값];

  • 초기값을 줄 수 있는 방법 2가지
    - 필드 선언 시에 주는 방법
    - 생성자에서 주는 방법

  • final 필드를 초기화하지 않으면 컴파일 에러 발생

  • 객체마다 저장되고, 생성자의 매개값에 따라 여러가지 값을 가짐

상수(static final)

  • 불변의 값
  • 공용성을 가지며, 여러 가지 값으로 초기화 불가능 <- final 필드는 상수가 아님
  • static final 필드는 객체마다 저장되지 않고, 클래스에만 포함됨, 변경 불가능
  • 상수 이름은 대문자로 작성하는 것이 관례

패키지

  • 클래스를 체계적으로 관리하기 위해 패키지를 사용
  • 클래스를 유일하게 만들어주는 식별자 역할
  • 클래스 이름이 같아도 다른 패키짐녀 다른 클래스로 인지

패키지 선언

  • 클래스를 컴파일하는 과정에서 자동적으로 생성되는 폴더

import문

  • 같은 패키지에 속하는 모든 클래스는 아무 조건없이 다른 클래스 사용 가능
  • 다른 패키지에 속하는 클래스를 사용하려면 해당 패키지를 import문으로 선언하고 클래스를 사용할 때 패키지를 생략

접근 제한자

public

  • 공개한단 의미
  • 외부 클래스가 자유롭게 사용 가능

protected

  • 같은 패키지 또는 하위 클래스에서 사용 가능

default

  • 같은 패키지에 소속된 클래스에서만 사용 가능

private

  • 외부에 노출되지 않음(같은 패키지도 사용 불가)
접근 제한적용할 내용접근할 수 없는 클래스
public클래스, 필드, 생성자, 메서드없음
protected필드, 생성자, 메서드하위 클래스가 아닌 다른 패키지에 소속된 클래스
default클래스, 필드, 생성자, 메서드다른 패키지에 소속된 클래스
private필드, 생성자, 메서드모든 외부 클래스

클래스 접근 제한

  • public, default
  • 클래스를 선언할 때 public을 생략하면 클래스는 default 접근 제한을 가짐

생성자 접근 제한

  • public, protected, default, private
  • 객체를 생성하기 위해선 new 연산자로 생성자를 호출애야 함

필드와 메서드 접근 제한

  • public, protected, default, private

Getter와 Setter 메서드

  • 객체 지향 프로그래밍에선 일반적으로 객체의 데이터는 객체 외부에서 직접 접근을 막음
  • 객체의 무결성이 깨질 위험(외부에서 마음대로 읽고, 변경) 때문
  • 메서드를 통해 데이터를 변경하는 것을 선호 <- Setter 메서드
  • 메서드를 통해 데이터를 읽어오는 것을 선호 <- Getter 메서드
  • 클래스를 선언할 때 필드를 private으로 외부로 부터 보호하고 필드에 대한 Getter, Setter 를 작성하여 사용

어노테이션

  • 메타데이터(컴파일 과정과 실행 과정에서 어떻게 처리, 실행할지 알려주는 정보)

어노테이션 용도

  • 컴파일러에게 코드 문법 에러를 체크하도록 정보 제공
  • 소프트웨어 개발 툴이나 빌드나 배치 시, 코드를 자동으로 생성할 수 있도록 정보 제공
  • 실행(런타임) 시, 특정 기능을 실행하도록 정보 제공
profile
Record Everything!!

0개의 댓글