생성자기본 생성자생성자 오버로딩(overloading)초기화 블럭(initialization block)객체지향의 특성 (1) : 캡슐화접근 제어 지시자(private, public, protected)정보 은닉thisstaticstatic 블록static 변수(=정적변수, 클래스 변수)static 메서드(=클래스 메서드)메모리 관련싱글톤
생성자
- 대부분의 생성자는 외부에서 접근 가능하지만, 필요에 의해 private으로 선언되는 경우도 있음
기본 생성자
- 클래스에 생성자를 구현하지 않아도 new 키워드와 함께 생성자를 호출할 수 있음
- 클래스에 생성자가 하나도 없는 경우 컴파일러가 생성자 코드를 넣어줌
생성자 오버로딩(overloading)
- 메써드 이름은 똑같고 파라미터가 다른경우
public class Student { public Student(){} public Studnet(String name, String ID, String address){ this.name = name; this.ID = ID; this.address = address } public Student(String name, String ID, String address, String etc){ this(name, ID, address); this.etc = etc; } }
- 생성자에서 다른 생성자를 부르기 위해서
this()
키워드를 사용함
초기화 블럭(initialization block)
- 초기화 블럭에는 ‘클래스 초기화 블럭'과 ‘인스턴스 초기화 블럭' 두 가지 종류가 있음
- 클래스 초기화 블럭 : 클래스 변수의 초기화에 사용. 클래스가 메모리에 처음 로딩될 때 한번만 수행됨
- 인스턴스 초기화 블럭은 인스턴스 변수의 초기화에 사용. 인스턴스를 생성할 때 마다 수행됨. 생성자보다 먼저 수행
class InitBlock{ static { /* 클래스 초기화블럭 입니다. */ } { /* 인스턴스 초기화 블럭 입니다. */} }
객체지향의 특성 (1) : 캡슐화
- 꼭 필요한 정보와 기능만 외부에 오픈. 대부분의 멤버 변수와 메서드를 감추고 외부에 통합된 인터페이스만은 제공하여 일관된 기능을 구현하게 함
- 무결성 : 변수는 private로 선언하고 Method를 public으로 선언한 후 method에서 validation을 하고 난 후 작업이 실행 되도록 함
- 객체 지향 설계 시, 외부에 그 method를 보여줄지 말지, 어떻게 사용하게 할 지를 설계 하는 것도 중요함
접근 제어 지시자(private, public, protected)
- private : 같은 클래스 내부에서만 접근 가능(외부 클래스, 상속 관계의 클래스에서도 접근 불가)
- 아무것도 없음(default, friendly) - 패키지 가시성: 같은 패키지 내부에서만 접근 가능(상속 관계라도 패키지가 다르면 접근 불가)
//com.programmers //com.programmers.girl // Jane // Secret // com.programmers.boy // Tom // Secret // 이러한 경우 같은 패키지 내에서만 Secret을 참조하게 해줌
- protected: 같은 패키지나 상속 관계의 클래스에서 접근 가능하고 그 외 외부에서는 접근 할 수 없음
- public : 클래스 외부 어디서나 접근 가능함
정보 은닉
- pirvate으로 선언된 멤버 변수에 대해 접근, 수정할 수 잇는 메서드를 public으로 제공
- 이렇게 함으로써 변수에 값을 할당할때 오류관리가 편해짐.
class Human{ private Heart heart; private Blood blood; Blood donation(){ return null; } } Human h = new Human();
this
- 인스턴스 자신의 메모리를 가리킴
- 생성자에서 또 다른 생성자를 호출할때
public class Student{ int age; String name; public Student(){ this(0, "이름없음"); } public Student(int age, String name){ this.age = age; this.name = name; }
- 자신의 주소(참조값)을 반환
static
static 블록
- 어떤 클래스의 객체가 생성되면서 딱 한번만 불려야 하는 코드를 정의하는 영역
- 객체가 생성되기 전에 한 번만 호출되고, 그 이후에는 호출하려고 해도 호출할 수가 없다.
- static 블록은 여러 개 선언할 수 있으며, 선언되어 있는 순서대로 호출됨
- 생성자가 호출되기 전에 호출되는 것. 클
public class StaticBlock { static int data = 1; public StaticBlock() { System.out.println("StaticBlcok Constructor."); } static { System.out.println("*** First static block. ***"); data = 5; } }
static 변수(=정적변수, 클래스 변수)
- 여러 인스턴스가 공유하는 기준값이 필요한 경우


- 인스턴스가 생성될 때 만들어지는 변수가 아니라, 처음 프로그램이 메모리에 로딩될때 메모리를 할당함
- 프로그램이 메모리에 로딩될때, code영역, data영역으로 메모리를 잡음
- data영역 - 상수, Literal, static변수
static 메서드(=클래스 메서드)
- 이 안에서는 instance 변수를 사용할 수 없음(당연한 것. instance가 만들어지지 않아도 불릴 수 있는 메서드이기때문에)
메모리 관련
- static 변수는 프로그램이 메모리에 있는 동안 계속 그 영역을 차지하므로 너무 큰 메모리를 할당하는 것은 좋지 않음
- 클래스 내부의 여러 메서드에서 사용하는 변수는 멤버 변수로 선언하는 것이 좋음
- 멤버 변수가 너무 많으면 인스턴스 생성 시 쓸데없는 메모리가 할당됨
싱글톤
public class CarFactory{ private static CarFactory factory = new CarFactory(); // private, static private CarFactory() {} // private public static CarFactory getInstance() { // 이걸로 하나의 instance만 반환 if (factory == null) { factory = new CarFactory(); } return factory; } public Car createCar() { Car car = new Car(); return car; } }