월루를 꿈꾸는 대학생

6-2 객체지향 본문

Programing/Java

6-2 객체지향

하즈시 2021. 3. 28. 16:19
728x90

 

3.10 재귀호출 

- 팩토리얼, 제곱, 트리운행 등 

- 메서드의 내부에서 메서드 자신을 다시 호출하는 것 

void method(){
	method();
}

 

- 호출된 메서드는 값에 의한 호출을 통해 복사된 값으로 작업 수행해서 독립적 수행 가능 

 

** 사용이유 -> 논리적 간결함 때문 다소 비효율적이더라도 알아보기 쉽게 적상허는 것이 생산확률 up 수정 간편 

 

** 팩토리얼 사용시에 스택 오버플로우 에러가 발생할 수 있으므로 항상 매개변수의 유효성 검사를 염두해 두고 작성 

 

 

3.11 클래스 메서드와 인스턴스 메서드

 

- 클래스 메서드 : 메서드 앞에 static 붙어 있는 것

- 인스턴스 메서드 : 그냥 메서드

 

- 클래스 메서드 : 객체 생성필요 없이 클래스이름.메서드이름 으로 호출 

- 인서턴스 메서드 : 반드시 객체를 생성한 후에 사용 가능 

 

인스턴스 메서드는 인스턴스 변수와 관련된 작업을 하는 즉 메서드의 작업을 수행하는데 인스턴수 변수를 필요로 하는 메서드 

인스턴스와 관계없는 ( 인스턴스 변수나 인스턴스 메서드를 사용하지 않는 ) 메서드를 클래스 메서드 (static 메서드) 라고 정의 

 

 

참고사항 ! 

 

1. 클래스를 설계할 때 멤버변수 중 모든 인스턴스에 공통적으로 사용하는 것에 static을 붙인다

- 모든 인스턴스에서 공통적으로 유지할 변수에 붙음 ex_ 카드의 가로 세로 길이

 

2. 클래스 변수 ( static 변수 )는 인스턴스를 생성하지 않아도 사용 가능 

- static이 붙은 변수 ( 클래스변수 ) 는 클래스가 메모리에 올라갈 떄 이미 생성 완료 즉 객체 안 만들어도 사용 가능 

 

3.  클래스 메서드 ( static 메서드 ) 는 인스턴스 변수 사용 x 

- 클래스 메서드는 인스턴스 생성없이 호출 가능 즉 인스턴스화 안 되어서 사용 못하는 인스턴스 변수를 접근한다면 오류가 발생할 수 있기에 애초에 금지  다만 static 붙은 멤버들은 접근 가능 -> static 은 이미 메모리에 올려져 있다는 뜻 

 

4. 메서드 내에서 인스턴스 변수 사용하지 않으면 static 붙이는 거 고려

- 메서드 호출 시간이 짧아지므로 성능향상 

 

** 클래스의 멤버변수 중 모든 인스턴스에 공통된 값을 유지해야하는 것이 있는지 살펴보고 있으면 static 붙이기 

** 작성한 메서드 중에서 인스턴스 변수나 인스턴스 메서드를 사용하지 않는 메서드에 static 붙일 것을 고려 

 

 

 

3.12 클래스 멤버와 인스턴스 멤버간의 참조와 호출 

 

- 같은 클래스에 속한 멤버들 간에는 별도 인스턴스 생성없이 서로 참조 및 호출 가능 

- 단 클래스멤버가 인스턴스 멤버 참조 및 호출시 인스턴스 생성 필요 -> 인스턴스가 없다면 액세스 조차 불가능한 게 인스턴스 멤버니까 

 

 

 

4. 오버로딩 ( Overloading ) 

 

4.1 오버로딩이란 ? 

 

- 보통 메서드 즉 함수는 이름으로 구분하는데 자바에서는 해당 메서드 이름을 동일하게 하고 매개변수의 갯수 또는 타입이 다르면 같은 이름을 사용해서 함수를 정의 가능

 즉 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 메서드 오버로딩이라 칭함 

 

 

4.2 오버로딩 조건 

 

1. 메서드 이름이 같아야 한다.

2. 매개변수의 갯수 또는 타입이 달라야한다. 

 

** 오버로딩 된 메서드들은 매개변수에 의해서만 구별이 가능하며 반환타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다. 

** 쓰는 이유 : 매개변수들은 다르지만 같은 기능을 가지고 있기에 오버로딩을 해준다. 사용시 편함 생산성 up 

 

 

4.4  오버로딩의 장점 

 

- 같은 기능을 가지는데 입력값이 다르다고 함수 이름을 여러번 짓는 것은 머리아픔 

 

 

4.5 가변인자와 오버로딩 

 

- 타입... 변수명 같은형식

- 가변인자는 내부적으로 배열을 이용 

 

 

5. 생성자 

 

5.1 생성자란 ? 

 

- 인스턴스 초기화 메서드 

- 인스턴스 변수의 초기화 작업에 주로 사용 

- 모든 클래스는 1개 이상 생성자가 있어야함 

 

생성자의 이름은 클래스의 이름과 같아야한다.

생성자는 리턴값이 없다 

 

생성자도 오버로딩이 가능하므로 하나의 클래스에 여러개의 생산자가 존재 가능 

 

연산자 new 가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것은 아님 

- new 에 의해 생성된 인스턴스에 적절한 값이 저장되도록 하는 것이 = 생성자 

생성자는 인스턴스변수들의 초기화에 사용되는 그냥 메서드다

 

Card c = new Card();

연산자 new에 의해서 메모리에 Card 인스턴스 생성
생성자 Card()가 호출되어 수행
연산자 new 결과로 생성된 Card 인스턴스 주소가 반환되어 참조변수 c에 저장 

 

 

5.2 기본 생성자 

- 모든 클래스는 반드시 하나 이상의 생성자가 정의 되어야 하지만 지금까지 컴파일러가 제공하는 기본 생성자를 통해 가능 

- 기본생성자는 클래스이름() { } 이 형태이나.. 그 전에 따로 만들었다면 기본 생성자는 쓰이지 않으므로 주의가 필요 

 

즉 기본 생성자가 컴파일러에 의해서 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때 뿐 

 

 

 

5.3 매개변수가 있는 생성자 

 

- 클래스 안에 생성자를 매개변수와 함께 정의한다면 보다 빠르고 간결하게 작업 가능 

- 그냥 기본생성자는 생성후 따로 초기화가 필요 즉 차를 사고 페이트 칠을 다시 해줘야함 수동으로

- 매개변수가 있는 생성자는 생성 후 이미 초기화까지 완료 - 즉 차 주문 전 생상 정하고 출고를 기다리는 것 

 

 

 

5.4 생성자에서 다른 생성자 호출하기 this() , this 

 

- 생성자 간에도 서로 호출이 가능 

생성자 이름으로 클래스 이름대신 this 사용 

한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출 가능 

 

 

5.5 생성자를 이용한 인스턴스 복사 

 

- 사용하고 있는 인스턴스와 같은 상태를 갖는 인스턴스를 더 만들고 싶을 때 

- 즉 두 인스턴스의 모든 변수가 동일한 값을 가지고 있는 것을 뜻함 

 

Car ( Car C ) {
	color = c.color;
}

 

 

6. 변수의 초기화 

 

6.1 변수의 초기화 

 

- 변수를 선언하고 값을 저장하는 것 

- 멤버변수는 초기화 하지 않아도 자동으로 기본값 초기화가 이루어진다

- 지역변수는 사용전 반드시 초기화가 필요 !!! 

 

6.2 명시적 초기화

- 변수를 선언과 동시에 초기화하는 것 

 

 

6.3 초기화 블럭 

 

- 클래스 초기화 블럭 : 클래스 변수의 복잡한 초기화에 사용

- 인스턴스 초기화 블럭 : 인스턴스의 복잡한 초기화에 사용 

 

class Block{

	static { /* 클래스 초기화 블럭 */ }
    
    { /* 인스턴스  초기화 블럭 */ }

}

 

- 클래스 초기화 블럭은 클래스가 메모리에 처음 로딩시 한번만 수행 

- 인스턴스 초기화 블럭은 인스턴스가 생성할 때마다 수행 

- 생성자 보다 인스턴스 초기화 블럭이 먼저 수행 

- 인스턴스 변수의 초기화 -> 공통으로 수행되어야하는 코드 넣는데 사용 // 즉 중복방지 

 

순위 

1. 클래스 초기화 블럭

2. main 메서드 

3. 인스턴스 초기화 블럭

4. 생성자 

 

 

 

728x90

'Programing > Java' 카테고리의 다른 글

7-1 객체지향  (0) 2021.04.04
6-2 알고리즘  (0) 2021.03.28
ch6 알고리즘  (0) 2021.03.21
ch 6-1 객체지향  (0) 2021.03.21
ch5 배열 백준 알고리즘  (0) 2021.03.13