본문 바로가기

JAVA - OOP

OOP(객체 지향 프로그래밍)

매개 변수의 수를 모를 경우 -> 매개 변수를 배열 타입으로 선언한다.

 

 e.g.

int sum1(int[] values) {

    int sum = 0;

 

    for(int i=0; i<values.length; i++) {

        sum += values[i];

    }

    return sum;

}

 

int sum2(int ... values) {

    int sum = 0;

 

    for(int i=0; i<values.length; i++) {

        sum += values[i];

    }

    return sum;

}

 

-----------------------------------------------

int[] value1 = {1,2,3};

int result1 = sum1(value1);

 

int result2 = sum1(new int[] {1,2,3.4,5});

 

int result3 = sum2(1,2,3);

 

※ 알아둬도 나쁠거 없는 상식

1. int 타입은 double 타입으로 자동 변환된다.

 

 e.g.

double result = 10 + 20; -> 30.0

 

 

메소드 오버로딩

매개 변수의 타입, 개수, 순서 중 하나가 달라야 한다.

리턴 타입만 다르고 매개 변수가 동일하다면 오버로딩이 아니다.

 

 e.g.

double areaRectangle(double width) {

    return width*width;

}

 

double areRectangle(double width, double height) {

    return width*height;

}

 

 

인스턴스 멤버(필드, 메소드)와 this의 관계

= 객체 내부에서 인스턴스 멤버에 접근하기 위해 this를 사용한다.

 

정적 멤버(클래스 멤버)와 static

- 객체를 생성하지 않고도 사용할 수 있는 특징을 갖고 있다.

- 원칙적으로 클래스 이름으로 접근해야 한다.

- 정적 필드를 위한 초기화 작업을 위해 static block을 제공한다.

- 정적 멤버는 인스턴스 멤버를 사용할 수 없다.

 

Q. 정적 멤버, 인스턴스 멤버 선언 시 판단 기준은 무엇일까?

A. 객체 마다 가지고 있어야 할 데이터라면 인스턴스 필드로 선언하고, 공용적인 데이터라면 정적 필드로 선언하는 것이 좋다.

 

 

싱글톤

- 가끔 전체 프로그램에서 단 하나의 객체만 만들도록 보장해야 하는 경우가 있다.

- 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아야 한다. (생성자 앞에 private을 붙인다.)

- private static [클래스] [객체이름] = new [클래스]();

- static [클래스] getInstance() { return [객체이름]; } (항상 동일한 객체를 return 한다.)

 

 

final

- 필드 선언 시에 값을 할당하거나, 생성자에서 초기화할 수 있다.

- static으로 선언시에는 static block에서도 초기화할 수 있다.