Java 입문 - 생성자/접근제어자
this 키워드
현재 객체를 지칭하는 참조변수
-
객체 생성시 자동으로 제공
-
사용방법:
-
this.멤버변수명
-
멤버변수명과 지역변수명을 this를 통해서 식별이 가능
→ 멤버변수명과 지역변수명을 동일하게 사용 가능
-
-
this(parameters)
- 현재 객체의 정의되어 있는 생성자 호출 수행
- 중복 코드 제거
- 유지보수 편리성, 객체 생성시에 공통로직이 존재하는 경우 일관성 유지, 변경시 편리
-
this
- 현재 객체를 반환타입으로 반환해야하는 경우 : return this;
- 메서드의 아규먼트로 전달해야하는 경우 : 메서드명(this);
-
JVM (Java Virtual Memory)
- 클래스 라이프사이클, 메모리, 실행 등을 관리하는 가상머신
- 5개 영역으로 구분
- 그 중 주요 영역 3개
- stack area
- 저장되는 데이터: 지역변수 - 메서드, 생성자 내부에 선언한 변수
- 메서드 호출시 ~ 메서드 종료 시점까지 메모리 할당
- 메서드 단위: frame
- heap area
- static이 붙지않은 멤버변수: 인스턴스 변수 (instance variable)
- new 객체 생성시에 해당 클래스의 멤버변수, 배열 저장
- new 객체 생성 ~ 더이상 참조하지 않을때까지 (null) 메모리 할당
- class area / method area / static area(우리나라에서만 이렇게 표현;; 올바른 용어는 X)
- class 로딩시에 해당 클래스의 메서드가 올라가는 영역
- static 멤버 (class 멤버변수, class 멤버메서드, 블럭초기화)
- class 로딩시 (app 시작) ~ class 해제 (app 종료) 까지 메모리 할당
- stack area
- 그 중 주요 영역 3개
생성자 (Constructor)
Class 구성요소
- 멤버변수
- 생성자
- 기본생성자
- 아규먼트 수가 적을수록 : 필수 데이터 초기화 생성자
- 아규먼트가 많을수록 : 전체 데이터 초기화 생성자
- 메서드
생성자
- 호출시점: new 클래스이름() 객체 생성시에 호출 수행
- 생성자의 목적:
- 멤버변수 초기화
- 객체 서비스 전에 선행 처리해야하는 로직 수행
- 특징:
- 모든 클래스는 최소 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; 객체지향 프로그래밍)
- Abstraction (추상화)
- 객체의 주요 특징(속성)을 추출해서 클래스를 설계하는 일련의 과정
- Encapsulation (은닉성)
- 목적: Information Hiding (데이터, 알고리즘)
- 올바르지 않은 사용자에 의해 데이터가 망가지지 않도록 하기위함
- 목적: Information Hiding (데이터, 알고리즘)
- Inheritance (상속)
- 이미 만들어져있는 클래스를 가져다가 사용
- Polymorphism (다형성)
- 변수의 타입(매개변수 반환타입)을 더 큰 타입으로 지정
Encapsulation (은닉성)
데이터 또는 알고리즘의 Information Hiding 을 위해 사용
-
데이터: 외부에서 올바르지 않은 데이터 변경 불가
- 도메인 클래스 (DTO, VO)에 Encapsulation을 적용해서 설계
-
알고리즘: 메서드에 적용, 상속받은 자식 클래스에서 변경불가 (재정의 불가)
-
설계규칙
-
private 멤버변수
- 예) private String memberId;
-
public getter() 메서드
- 형식: public xxx타입 getXxx() { return xxx; }
- 예) public String getMemberId() { return memberId; }
-
public setter() 메서드
-
변경, 수정 메서드
-
형식: public void setXxx (xxx타입 xxx) { this.xxx = xxxx; }
-
예) public void setMemberId(String memberId) { this.memberId = memberId; }
-
아규먼트로 전달받은 데이터를 검증하는 로직이 누락
→ 올바르지 않은 데이터로 변경될 수도 있는 문제 (this.memberId = memberId;)
-
변경 전에 데이터가 로직에 올바른 데이터인지 검증하는 로직 수행이 필요
-
-
-
private isXxxx() 데이터 검증 메서드
-
상속을 받아도 자식클래스에서 변경(재정의) 불가 메서드
⇒ 부모 클래스에서 정의한 메서드를 그대로 사용해야 함 (로직변경불가)
private boolean isXxx (xxx타입 xxx) { if(검증로직) { return true; } else { return false; } }
-
-
댓글남기기