Java 입문 - 생성자/접근제어자

2 분 소요

this 키워드

현재 객체를 지칭하는 참조변수

  • 객체 생성시 자동으로 제공

  • 사용방법:

    1. this.멤버변수명

      • 멤버변수명과 지역변수명을 this를 통해서 식별이 가능

        → 멤버변수명과 지역변수명을 동일하게 사용 가능

    2. this(parameters)

      • 현재 객체의 정의되어 있는 생성자 호출 수행
      • 중복 코드 제거
      • 유지보수 편리성, 객체 생성시에 공통로직이 존재하는 경우 일관성 유지, 변경시 편리
    3. this

      • 현재 객체를 반환타입으로 반환해야하는 경우 : return this;
      • 메서드의 아규먼트로 전달해야하는 경우 : 메서드명(this);

JVM (Java Virtual Memory)

  • 클래스 라이프사이클, 메모리, 실행 등을 관리하는 가상머신
  • 5개 영역으로 구분
    • 그 중 주요 영역 3개
      1. stack area
        • 저장되는 데이터: 지역변수 - 메서드, 생성자 내부에 선언한 변수
        • 메서드 호출시 ~ 메서드 종료 시점까지 메모리 할당
        • 메서드 단위: frame
      2. heap area
        • static이 붙지않은 멤버변수: 인스턴스 변수 (instance variable)
        • new 객체 생성시에 해당 클래스의 멤버변수, 배열 저장
        • new 객체 생성 ~ 더이상 참조하지 않을때까지 (null) 메모리 할당
      3. class area / method area / static area(우리나라에서만 이렇게 표현;; 올바른 용어는 X)
        • class 로딩시에 해당 클래스의 메서드가 올라가는 영역
        • static 멤버 (class 멤버변수, class 멤버메서드, 블럭초기화)
        • class 로딩시 (app 시작) ~ class 해제 (app 종료) 까지 메모리 할당

생성자 (Constructor)

Class 구성요소

  1. 멤버변수
  2. 생성자
    • 기본생성자
    • 아규먼트 수가 적을수록 : 필수 데이터 초기화 생성자
    • 아규먼트가 많을수록 : 전체 데이터 초기화 생성자
  3. 메서드

생성자

  • 호출시점: new 클래스이름() 객체 생성시에 호출 수행
  • 생성자의 목적:
    1. 멤버변수 초기화
    2. 객체 서비스 전에 선행 처리해야하는 로직 수행
  • 특징:
    • 모든 클래스는 최소 1개 이상의 생성자 중복 정의
    • 생성자 이름은 반드시 해당 클래스 이름과 동일해야 함
    • 반환타입이 존재하지 않음. 즉, 표기해서는 안됨 (void 도 표기 X)
    • 중복정의규칙:
      • 이름은 클래스 이름과 동일
      • 아규먼트 다름: 갯수, 순서, 타입
  • 형식:
    • [access-modifiers] 클래스이름( ) { }
    • [access-modifiers] 클래스이름(args) { }

기본 생성자 (default constructor)

개발자가 명시적으로 생성자를 정의하지 않는 경우 javac(컴파일러)에 의해서 자동으로 제공되는 생성자

  • 형식: (no argument) {empty body}

    public 클래스이름( ) { }

  • 생성자 중복정의를 할 경우 기본생성자도 함께 중복 정의하는 것을 권장

  • 개발자 필요에 의해 기본 생성자를 제공하지 않는 경우도 있음 (Wrapper class: java.lang.Integer, 추후설명)

Access Modifiers

접근 권한을 제어하는 제어자


↓ 2일차 노트 내용

1. access modifiers

접근 권한을 제어하는 제어자

public(+)

  • 필요시에 어떤 클래스든지 상관없이 접근 가능
  • 클래스, 멤버변수, 생성자, 메서드에 사용

protected(#)

  • sub class (상속받았다면 다른 패키지에 있는 클래스도 접근 가능)
  • 멤버변수, 메서드

default, package, friendly (생략):

  • same package (같은 패키지에 있는 클래스 접근 가능)
  • 클래스, 멤버변수, 생성자, 메서드, 지역변수

private(-):

  • same class (현재 클래스에서만 접근 가능)
  • 멤버변수, 생성자, 메서드

2. usage modifiers

사용과 관련된 제어자

static

  • 객체생성없이 사용가능한 멤버변수, 멤버메서드, 초기화블럭

abstract

  • 미완성 클래스, 미완성 메서드

final

  • 상속불가 클래스, 재정의 불가 메서드, 값변경불가 상수

OOP 특징 (Object Oriented Programming; 객체지향 프로그래밍)

  1. Abstraction (추상화)
    • 객체의 주요 특징(속성)을 추출해서 클래스를 설계하는 일련의 과정
  2. Encapsulation (은닉성)
    • 목적: Information Hiding (데이터, 알고리즘)
      • 올바르지 않은 사용자에 의해 데이터가 망가지지 않도록 하기위함
  3. Inheritance (상속)
    • 이미 만들어져있는 클래스를 가져다가 사용
  4. Polymorphism (다형성)
    • 변수의 타입(매개변수 반환타입)을 더 큰 타입으로 지정

Encapsulation (은닉성)

데이터 또는 알고리즘의 Information Hiding 을 위해 사용

  • 데이터: 외부에서 올바르지 않은 데이터 변경 불가

    • 도메인 클래스 (DTO, VO)에 Encapsulation을 적용해서 설계
  • 알고리즘: 메서드에 적용, 상속받은 자식 클래스에서 변경불가 (재정의 불가)

  • 설계규칙

    1. private 멤버변수

      • 예) private String memberId;
    2. public getter() 메서드

      • 형식: public xxx타입 getXxx() { return xxx; }
      • 예) public String getMemberId() { return memberId; }
    3. public setter() 메서드

      • 변경, 수정 메서드

      • 형식: public void setXxx (xxx타입 xxx) { this.xxx = xxxx; }

      • 예) public void setMemberId(String memberId) { this.memberId = memberId; }

        • 아규먼트로 전달받은 데이터를 검증하는 로직이 누락

          → 올바르지 않은 데이터로 변경될 수도 있는 문제 (this.memberId = memberId;)

        • 변경 전에 데이터가 로직에 올바른 데이터인지 검증하는 로직 수행이 필요

    4. private isXxxx() 데이터 검증 메서드

      • 상속을 받아도 자식클래스에서 변경(재정의) 불가 메서드

        ⇒ 부모 클래스에서 정의한 메서드를 그대로 사용해야 함 (로직변경불가)

      private boolean isXxx (xxx타입 xxx) { 
      		if(검증로직) { 
      				return true;
      		} else {
      				return false;
      		}
      }
      

댓글남기기