07일차 학습내용
1. 생성자 constructor 2. 기본생성자 default constructor 3. this 레퍼런스 4. this() 디스메서드 5. 객체 배열 6. 객체의 소멸 7. 가비지 8. 가비지 컬렉션 Gabage Collection 9. 접근지정자 modifier |
1. 생성자 constructor
1) 객체가 생성될 때, 객체의 초기화를 위해 실행되는 메서드입니다. 즉 생성자는 new를 통해 객체를 만들기 전에 세팅작업을 하는 역할을 합니다.
자바의 모든 클래스는 생성자를 가지고 있으며,
생성자가 기술 안되어있으면 "기본생성자"가
자동으로 호출됩니다. (by JVM)
* 생성자 포함 자바에서 초기화는 3가지 방식이 있습니다.
1.생성자 |
2. 초기화 블럭 클래스 블럭 / 인스턴스 블럭 |
3. 명시적 초기화 |
메서드 밖에 작성 | 메서드 밖에 작성(자동실행) | 메서드 안에 작성 |
클래스명(){ 코드 (#실행순서3 객체생성) } 인스턴스 변수를 초기화 하기 위해 주로 사용 |
static{ 코드 ( #실행순서1 프로그램시작) } { 코드 (#실행순서2 객체생성마다) } 앱만들 때 많이 사용 |
int a = 10; |
3) 생성자 선언 및 활용
#1. 객체가 생성되는 순간에 new를 통해 자동으로 한 번만 호출.
재호출 불가능.
(반면 메서드는 필요할 때마다 호출 가능합니다. 생성자와 동일한 변수를 메서드에 넣어두면, 추후에 계속 실행가능)
#2. 생성자의 이름은 반드시 클래스 이름과 동일
#3. 리턴타입 지정 불가
return; 키워드 이용하여 상황에 따라 강제종료는 가능. // 리턴물은 없으니까 리턴만 적어서 사용
#4. 매개변수 지정 가능
#5. 생성자는 오버로딩 가능. // 이름 같고, 매개변수 다르게
#6. 목적은 객체 생성시, 필요한 초기 작업 진행 (변수값 초기화, 필요한 메모리 확보, 외부 파일열기, 네트워크 연결과 같은 작업을 초기화 블럭에 작성)
4) 생성자 구조
클래스명(){
//초기화 코드들...
}
2. 기본생성자 default constructor
1) 매개변수가 없는 생성자를 칭함
클래스명(){}
2) 클래스는 생성자가 하나이상은 반드시 존재합니다. 우리가 코드에 작성하지 않더라도 객체가 생성될 때
컴파일러가 자동으로 내용없는 기본생성자를 추가합니다. (지금까지 우리가 쓰던 방식)
그러나 매개변수가 있는 생성자를 직접 작성한 경우라면 컴파일러는 작성자의 의도를 존중해서 기본생성자를 만들지 않습니다.
인스턴스변수명(메서드 밖)과 매개변수 이름(메서드 안)이 이 동일한경우 지역변수 우선 인식이니까 인스턴스 변수인걸 나타내려면 this.를 붙여줘야 합니다.
(두개의 이름이 다른 경우라면 this를 안써도 됩니다.)
this : 현재 레퍼런스가 실행되는 내 객체 안에 있는 객체 자신.
3. this 레퍼런스
1) 객체 자기 자신을 가르킴
2) 인스턴스메서드나 생성자에서 사용됨. // static에서는 못쓰지. 객체생성 안하니까. this는 주소값이니까.
3) this 필요성
#1. 지역변수나 매개변수가 인스턴스변수의 이름과 같을 경우 // 우리가 많이 쓸것
인스턴스변수임을 구별하려는 목적으로 사용
#2. 메서드가 객체 자기자신의 레퍼런스를 리턴해야하는 경우 사용 // 우리는 안나올거지만..
4. this() / 디스메서드
1) 클래스내 생성자 안에서 다른 생성자를 호출할 때 사용. 객체생성하자마자 다른 생성자 호출
(밖에서는 생성자를 다시 부르고싶어도 못부르는데 내 생성자 안에서 다른 생성자 기능도 같이 한번에 초기화를 시키고 싶을 때.)
2) 생성자 안에서만 사용가능 메서드 (메서드 안에서 불가능)
3) 생성자 안에서 다른 생성자의 기능이 필요할 때 사용 ( 동일 기능을 코드를 중복 작성할 필요 없게 기존 다른 생성자에 있는 코드를 가져다 쓰는 경우)
4) 생성자가 두개 이상일 경우 사용 가능 (생성자 오버로딩이 되어있어야 쓸 수 있지)
5) 다른 생성자 호출시, 반드시 생성자의 첫번째 명령문으로 작성. // =this()를 두번 쓸수도 없다는 말.
6) 코드 재사용성을 높이는 방법 중 하나입니다.
* 클래스 안에는 변수- 생성자 - 메서드 순으로 작성
5. 객체 배열
1) 배열은 기본타입뿐만 아니라, 객체를 원소로 하는 객체 배열도 만들 수 있습니다. 기존 배열은 3일차 4일차에서 배웠는데요, 기존 배열과 다른 점은
2) 객체에 대한 레퍼런스(주소값)를 배열의 요소로 갖는 것입니다.
3) 배열 선언 및 생성
객체배열 | 기본형배열 |
#1. 선언 클래스명[] 변수명; |
#1. 선언 int[] arr; |
#2. 배열 공간 할당 변수명 = new 클래스명[방크기]; |
#2. 방크기 지정 arr = new int[방크기] |
#3. 값 대입 - 객체생성 변수명[방인덱스] = new 클래스명(); |
#3. 값 대입 변수명[방인덱스] = 10; |
#4. 접근 변수명[인덱스] --> 해당 객체가 생선된 저장공간의 주소 변수명[인덱스].변수명 변수명[인덱스].메서드명() // 대괄호 [] 다음. 소괄호() |
#4. 접근 변수명[인덱스] --> 해당 방에 들어있는 int값 |
* #3. 이 부분이 기존 배열과의 차이입니다.
6. 객체의 소멸
1) 자바에서는 객체를 생성하는 new 연산자는 있지만,
객체를 소멸시키는 연산자는 없습니다.
-> 개발자가 마음대로 객체 소멸 시킬 수 없다는 말인데요. (메모리해제X)
2) 객체 소멸이란 : new에 의해 생성된 객체 공간을
JVM에 돌려주어 가용 메모리에 포함시키는 것입니다.
3) 자바에서는 이렇게 사용되지 않는 객체메모리(가비지)를
JVM의 가비지컬렉터가 적절한 시점에 자동으로 수거하여
메모리를 해제시키게 됩니다.
7. 가비지
1) 더이상 사용되지 않는 객체나 배열메모리를 칭합니다.
2) 참조하는 레퍼런스가 하나도 없는 객체나 배열을 가비지로 판단합니다.
a = new Person("김피카츄"); b = new Person("박꼬북이"); b = a; --> a = 김피카츄, b = 김피카츄 // 박꼬북이가 쓰레기가 됨 |
a = null; b = null; --> 둘다 널처리를 함으로써 김피카츄도 쓰레기가 됨 . 링크 바로 끊는 명령은 없지만 널을 넣거나 다른 데이터를 넣으면 됨. |
8. 가비지 컬렉션 Gabage Collection
1) 가비지가 많으면 사용할 수 있는 (가용)메모리가 줄어듭니다.
-> 메모리가 부족하면 프로그램 실행X
-> 자바 플랫폼은 가용메모리가 일정 크기 이하로 줄어들면
자동으로 가비지를 회수하게됩니다.
2) 가비지 컬렉션은 가비지 컬렉션 스레드(일꾼)에 의해 처리됩니다.
3) 자바 플랫폼 내부의 판단에 의해 실행되므로,
언제 가비지 컬렉션이 수행되는지 알기 어렵습니다.
4) 단점 : 가비지 컬렉터가 실행되면 응용프로그램은 실행을 멈추고 기다리게 되기에.
-> 실시간 처리 응용프로그램으로 부적합합니다. ex. 실시간온라인게임
5) 강제 요청은 System 또는 Runtime 객체의 gc() 메서드를 호출하면
요청할 수는 있으나 요청하는 즉시 작동하지는 않습니다.
9. 접근지정자 modifier
1) 객체 지향 언어는 접근지정자를 두고 있다.
Java에서는 객체를 캡슐화하기때문에, 즉
객체에 다른 객체가 접근하는 것을 허용할지 말지를
지정할 필요가 있기 때문입니다. 이런 캡슐화를 위해 알아야 하는 게 접근지정자입니다.
*캡슐화: 클래스 안에 데이터가 막 접근하지 못하게 하는 것.
2) 패키지 package
자바는 서로 관련있는 클래스 파일들을 패키지에 저장하여 관리합니다.
패키지 : 윈도우의 디렉토리 or 폴더 개념
3) 자바의 4가지 접근지정자 ( 위치 - 클래스냐 변수나 메서드냐)
# 클래스 앞에 붙는 것 (붙거나 안붙거나 2개) : 다른 클래스에서 이 클래스를 활용할 수 있는지 허용 여부를 지정. |
# 멤버 앞에 붙는 것 (4개) : private < default < protected < public |
1. public 클래스 : 패키지에 상관없이 다른 어떤 클래스에서도 사용이 허용됨. public class 클래스명 { } |
1. public 변수/메서드 : 모든 클래스에서 접근 가능 public 타입 변수명 public 리턴타입 메서드명(){ ... } |
2. private 변수/메서드 : 비공개, 같은 클래스 내의 멤버들에게만 접근 허용 private 타입 변수명 private 리턴타입 메서드명(){ ... } |
|
3. protected 변수/메서드 : 보호된 공개, 같은 패키지의 모든 클래스와 다른패키지라도 자식클래스라면 접근 허용 -> 상속을 유도 |
|
2. default 클래스 (접근지정자를 생략) : 같은 패키지 내의 클래스들이게만 사용이 허용됨, class 클래스명 { } |
4. default 변수/메서드 : 동일한 패키지 내 클래스들에게 접근을 허용 |
4) 캡슐화 encapsulation (자바가 추구하는 코딩 형태)
변수 : private
메서드 : public // private에 접근하고 싶으면 메서드를 통해서 우회 접근해라~~ 데이터의 무분별한 공개를 막아줍니다. 다른 라이버브러리 가져다 쓰려면 게터세터로 구조 짜놔야 제대로 동작합니다. 자바가 추구하는 거라 이렇게 만들어야만 돌아가게 해논게 많아서 캡슐화를 해야만 하는 경우가 있기도 합니다.
--> getter/ setter : (get method/ set method)
get변수명() : private 으로 되어있는 변수의 값을 꺼내기
set변수명() : 데이터를 대입, 수정
* 이름 잘 붙여주세영~~~~~
private String name; // 게터 세터를 만들 때 변수의 이름 첫글자를 대문자로 작성해야 합니다.
//그래서 소문자로 변수이름을 적어야 하는것...!
public String getName(){ return name; } // 변수 이름의 첫글자를 대문자쥬?
public void setName(String name) { this.name = name; }
get은 사용자 입장에서 가져와야하니까 return이 있어야 하고 - type이 있어야 합니다. !! 기준을 잡아서 외우기
set은 사용자 입장에서 넣어야하니까 매개변수가 있어야 하고 return값 없어야 하니까 void
private 변수/메서드가 있을 때 무조건 get 메서드, set 메서드를 만들어야 할까요?
아닙니다! setter getter 일부러 안만들어서 내부에서만 쓰는 데이터도 있습니다.
+ 이제 package파일의 내부를 유심히 살펴보면 메인 메서드 이름이 왜 그렇게 생겼는지 알 수 있쥬
class Test{
public static void main (String[] agrs){
}
}
공개범위 + 메서드 로딩 + 출력 + 이름 ( 입력-배열로 ){
}
'코딩' 카테고리의 다른 글
2022.02.17_9일차_다형성과 추상클래스 (0) | 2022.02.23 |
---|---|
2022.02.16_8일차_상속과 오버라이딩 (0) | 2022.02.22 |
2022.02.14_6일차_메서드와 메서드 오버로딩 (0) | 2022.02.20 |
2022.02.11_5일차_클래스와 객체, 변수의 종류 (0) | 2022.02.19 |
2022.02.10_4일차_다차원배열 (0) | 2022.02.18 |
댓글