Java

JAVA 자바 웹 개발 Day7 (Note): 생성자, this, 객체 배열, 접근 지정자, 캡슐화

jnk1m 2022. 2. 16. 00:16

2022-02-15

 

생성자 Constructor

1.  객체가 생성될 때 객체의 초기화를 위해 실행되는 메서드. 아예 다 채워놓고 생성하겠다…… 자바의 모든 클래스는 생성자를 가지고 있다. 생성자가 기술이 되어 있지 않는 경우엔 눈에 보이진 않지만 "기본 생성자"가 아무것도 없는 형태로 자동으로 만들어져 호출된다. 

2.  자바 초기화(초기화 세팅하기)는 3가지 방식이 있다.

 1) 생성자: 인스턴스 변수를 초기화하기 위해 주로 사용.

 2) 명시적 초기화: int a= 10; 이렇게 값 대입하는 것.

 3) 초기화 블록: 클래스 블록 / 인스턴스 블록: 생성자보다 먼저 초기화. 애초부터 처음부터 세팅을 해줘야 할 경우..       

[구조]

A.   클래스 블록

static {
  //초기화에 필요한 코드들
}
프로그램 실행 시 자동으로 한번 실행됨. 메인 실행 전 프로그램 시작 시 초기화해줄 때.

B.   인스턴스 블록
{
  //초기화에 필요한 코드들
}
객체 생성 시 자동으로 한번 실행됨. 객체 생성 시 초기화해줄 때.

 

3.  생성자 선언 및 활용

①   객체가 생성되는 순간에 new를 통해 자동으로 한번 호출된다. 재호출 불가능. (반면 메서드는 필요할 때마다 호출 가능)

②   생성자의 이름은 반드시 클래스 이름과 동일해야 한다.

③   리턴 타입 지정 불가. 리턴이 없음. 강제 종료할 때 사용하는 return; 키워드 사용하여 강제 종료는 가능.

④   매개변수 지정 가능.

⑤   생성자는 오버 로딩할 수 있다.

⑥   목적은 객체 생성 시, 필요한 초기 작업을 위함이다.
변숫값 초기화, 필요한 메모리 확보, 파일 열기, 네트워크 연결 등 객체가 활동하기 전에 필요한 초기 준비 시 이용.

 

4.  생성자 구조  
 클래스명(){
    //초기화 코드들
}

 

기본 생성자 Default Constructor

1.  매개변수가 없는 생성자를 칭함.
클래스명(){}

2.  클래스는 생성자가 하나 이상은 반드시 존재한다. 객체 생성 시 반드시 한번 실행된다. 클래스에 명시된 생성자가 하나도 없으면 컴파일러가 자동으로 내용 없는 기본 생성자를 추가한다.

 

this 레퍼런스

1.  객체 자기 자신을 가리키는 래퍼런스.

2.  인스턴스 메서드나 생성자에서 사용됨. 객체 생성이 안되기 때문에 static에선 사용 불가.

3.  this가 필요한 이유:

①   지역변수나 매개변수와 인스턴스 변수의 이름이 같을 경우 구별하려는 목적으로 사용

②   메서드가 객체 자기 자신의 래퍼런스를 리턴해야 하는 경우

 

this()

1.  클래스 내 생성자 안에서 다른 생성자를 호출할 때 사용

2.  생성자 안에서만 사용 가능한 메서드

3.  생성자 안에서 다른 생성자의 기능이 필요할 때 사용

4.  생성자가 두 개 이상일 경우 사용 가능 (생성자 오버 로딩)

5.  다른 생성자 호출 시, 반드시 생성자의 첫 번째 명령문이 되어야 한다.

6.  코드 재사용성을 높이는 방법 중 하나.

 

객체 배열

1.  배열은 기본 타입뿐만 아니라, 객체를 원소로 하는 객체 배열도 만들 수 있다.

2.  객체에 대한 래퍼런스(주소 값)를 배열의 요소로 갖는다.

3.  배열 선언 및 생성

①   배열에 대한 래퍼런스 변수 선언
int [] arr; 또는
클래스명 [] 변수명

②   배열 공간 만들기
변수명 = new 클래스명[방 크기];   <<- 중요! 까먹지 말기.

③   객체 생성 (배열 안에 요소로 채우기)
변수명[0] = new 클래스명(); <- 방하나 채우기
for(int i = 0; i < 변수명. length; i++){
 변수명[i] = new 클래스명();
}

4.  배열 안 객체의 멤버에 접근
배 열변 수명[인덱스]. 변수명
배 열변 수명[인덱스]. 메서드명()

package day10;
class Circle{
	int radius;
	Circle(int radius){
		this.radius = radius;}
}
public class bogang {
	public static void main(String[] args) {
		Circle[]cArr = new Circle[10]; //써클 객체를 열개 넣겠다
		//데이터가 묶음으로 있는 것. 다 묶어서 세트로 만들겠다.
		//포문에서 또 각 방에다가 객체 만들어줘야함. 
		for(int i = 0; i < cArr.length; i++) {
			cArr[i] = new Circle(10); //위에 생성자 땜에 인자 줘야함
		}// 각 객체 배열 안에 있는 변수 radius의 값이 10인 객체 배열이 10개 만들어짐. 
	}
}

 

객체의 소멸

1.  자바에서는 객체를 생성하는 new 연산자가 있지만, 객체를 소멸시키는 연산자는 없다. -> 개발자가 마음대로 객체 소멸시킬 수 없다. (메모리 해제 x)

2.  객체 소멸: new에 의해 생성된 객체 공간을 JVM에게 돌려주어 가용 메모리에 포함시키는 것.

3.  자바에서는 이렇게 사용되지 않는 객체 메모리(가비지)를 JVM GC가 적절한 시점에 자동으로 수거하여 메모리를 해제시킨다.

가비지:

더 이상 사용되지 않는 객체나 배열 메모리를 칭함. 참조하는 래퍼런스가 하나도 없는 개체나 배열을 가비지로 파단.

 

가비지 컬렉션 Garbage Collection

(수거해가는 건 가비지 컬렉터. 컬렉션은 해당 기능을 뜻함)

1.  가비지가 많으면 사용할 수 있는 (가용) 메모리가 줄어든다.
메모리가 부족하면 프로그램 실행 x
자바 플랫폼은 가용 메모리가 일정 크기 이하로 줄어들면 자동으로 가비지 회수한다.

2.  가비지 컬렉션은 가비지 컬렉션 스레드 (일꾼)에 의해 처리된다.

3.  자바 플랫폼 내부의 판단에 의해 실행되므로, 언제 가비지 컬렉션이 수행되는지 알기 어렵다.

4.  단점: 가비지 컬렉터가 실행되면 응용 프로그램은 실행을 멈추고 기다린다. -> 실시간 처리 응용 프로그램은 부적합 ex) 실시간 온라인 게임

5.  강제 요청은 System 또는 Runtime 객체의 gc() 메서드를 호출하면 요청할 수 있으나 즉시 작동하지는 않는다.

 

접근 지정자 Modifier

1.  객체 지향 언어는 접근 지정자를 두고 있다. 객체를 캡슐화하기 때문에, 객체에 다른 객체가 접근하는 것을 허용할지 말지를 지정할 필요가 있기 때문.

2.  패키지 package
자바는 서로 관련 있는 클래스 파일들을 패키지에 저장하여 관리
패키지: 윈도우 디렉터리 or 폴더와 같은 개념

3.  자바의 접근 지정자
클래스 접근 지정자: 다른 클래스에서 이 클래스를 활용할 수 있는지 허용 여부를 지정.

①   public 클래스: 패키지에 상관없이 다른 어떤 클래스에서도 사용이 허용됨.
public class 클래스명{}

②   default 클래스: 접근 지정자를 생략한 형태. 같은 패키지 내의 클래스들에게만 사용이 허용됨.
class 클래스명{}

 

멤버 접근 지정자
private < default < protected < public 순으로 공개범위 넓어짐.

A.   public 멤버: 모든 클래스에서 접근 가능
public 타입 변수명
public 리턴 타입 메서드명(){……}

B.   private 멤버: 비공개, 같은 클래스 내의 멤버들에게만 접근 허용
private 타입 변수명
private 리턴 타입 메서드명(){……}

C.   protected 멤버: 보호된 공개, 같은 패키지의 모든 클래스에게 공개. 다른 패키지라도 자식 클래스라면 접근 허용 -> 상속 유도
protected 타입 변수명
protected 리턴 타입 메서드명(){……}

D.   default 멤버 (접근 지정자 생략): 동일한 패키지 내 클래스들에게 접근 허용
타입 변수명
리턴 타입 메서드명(){……}

 

4.  캡슐화 encapsulation (자바가 추구하는 코딩 형태)
변수: private // 메서드: public. 메서드를 통해 변수에 접근하게 만들어 변수의 무분별한 수정 및 접근을 막는다.
-> getter/setter
 get변수명(): private비공개로 되어있는 데이터를 출력하고 싶을 때
private String name;
public String getName() {return name;}  //첫 글자 대문자 중요!!
set변수명(): 데이터 대입하고 싶을 때
public void setName(String name){

this.name = name;} //첫 글자 대문자 중요!!

 클래스 내에 이렇게 작성함.