Information Security Study
240103 함수, 클래스 본문
함수의 저장 위치
함수는 기본적으로 static 영역에 저장된다.
public void example1(){
실행문;
} //선언부
위와 같이 선언하면 정적영역에 해당 함수(메서드)가 저장되어 호출할 수 있는 상태가 된다.
public static void main(){
example1();
}
중괄호, 블럭 구역이 main과 다르게 설정되어있기에 main과는 별도로 example1지역이 생긴다.
해당 함수 내의 코드가 돌아가는 동안은 example1 구역이 존속하다가
닫는부분을 만나면 해당 구역이 스택에서 삭제되고 main구역으로 호출했던 라인 다음으로 넘어간다.
클래스의 시작
해당 구조체 전용 함수를 굳이 바깥에 두기보다는 구조체 내부에 배치하면
좀 더 활용처가 명확해지고 호출도 안전해진다.
이를 위해 특정 구조체용 함수를 구조체 내부에 선언한것을 클래스라고 부른다. (C언어는 불가능)
이 경우 해당 함수는 클래스의 소속이므로 함수가 아닌 메서드라고 부른다.
struct 키워드로 만들어 함수를 호출한 형태는 생성자와 소멸자를 가질 수 없다는 점에서 차이가 난다.
- 클래스의 변수는 객체의 속성이고, 클래스의 메서드는 객체의 기능이다.
★★★★★★★★★★★★★★
객체 생성 new
클래스명 변수명 = new 클래스();
★★★★★★★★★★★★★★
- new 키워드는 “힙”에 해당 자료를 생성하고 자료의 주소를 리턴한다.
- 멤버변수: 클래스 안에 선언된 변수이다. 초기화를 하지 않아도 자동으로 각 데이터 타입의 기본값으로 자동 초기화 된다. ex) int a; //0으로 초기값이 설정됨.
- 지역변수: 메서드 안에 선언된 변수이다. 지역변수는 메서드 블록 밖에서는 사용할 수 없습니다. 사용하기 전에 반드시 초기화를 해야 한다.
생성자는 구조체와 클래스의 가장 큰 차이점!
사용자가 만약 필드에 값을 저장하지 않는다고 해도 생성을 막을 방법은 없기 때문에
사용자가 필수 필드에 강제로 값을 채우도록 강요해야 한다.
이를 위해 생성자 함수라는것을 클래스 내부에 정의한다.
보편적으로 생성자 함수는 클래스명과 동일한 이름이며 리턴자료형이 없는 함수를 정의하면 된다.
- 생성자는 객체가 생성될 때 객체의 상태(멤버변수)를 초기화하는데 사용된다.
- 객체가 생성될 때 new 키워드 다음에 오는 것을 생성자라고 한다.
- 생성자는 메서드와 모양이 비슷하게 생겼지만, 반환 타입을 적지 않고 클래스 이름과 대/소문자까지 똑같이 만들어야 한다.
- 생성자는 반드시 클래스 안에 하나 이상 선언해야 하며, 만일 생성자를 만들지 않을 경우 자바 가상 머신(JVM: Java Virtual Machine)이 대신해서 기본 생성자를 자동으로 하나 만들어 준다.
- 기본 생성자는 매개 변수를 가지지 않는 기본 형태의 생성자이다. ex) Pen() { }
생성자를 만드는 규칙
- 생성자의 이름은 클래스 이름과 대/소문자까지 정확히 같아야 합니다. 만약 클래스 이름과 다른 이름으로 만들면 메서드로 간주한다.
- 생성자는 메서드와는 달리 반환 유형을 적지 않는다.
- 생성자는 다른 유형으로 여러개 생성 가능하다. (생성자 오버로딩)
Garbage Collecting
- 객체를 생성하는데 사용되는 키워드는 new이지만, 생성된 객체를 메모리에서 해제시키는 키워드는 자바에서 존재하지 않는다.
- 그 이유는 자바에서는 **자바 가상머신(JVM)**이 알아서 메모리를 관리해주며, 이를 가비지 컬렉팅이라 한다.
- 객체가 더 이상 프로그램에서 사용되지 않으면(스택과의 연결이 끊어져서 호출이 불가능하다면)
- 가비지 컬렉터가 스스로 판단해서 메모리를 해제하고 수거한다.
package garbagecollection;
public class GarbageCollectorTest {
public int objectNum; // 객체 번호
// 생성자(객체가 힙에서 생성될 때 호출되는 메서드)
public GarbageCollectorTest(int number) {
objectNum = number;
System.out.println(objectNum + "번 객체 생성");
}
// 소멸자(자바에서는 일반적으로 사용하지 않음, 객체가 힙에서 삭제되기 직전 실행)
@Override
protected void finalize() throws Throwable {
System.out.println(objectNum + "번 객체가 힙에서 삭제됩니다.");
}
}
package garbagecollection;
public class GarbageCollectorTestMain {
public static void main(String[] args) throws Exception{
GarbageCollectorTest test2 = null;
for(int i = 0; i < 5; i++) {
GarbageCollectorTest test =
new GarbageCollectorTest(i);
if(i == 3) {
test2 = test; //3번 객체는 test2와 연결 유지
}
test = null;
}
// 쓰레기 수집 강제 실행 명령어(실제로는 쓸 필요는 없음)
System.gc();
Thread.sleep(1000); // 1초간 코드 정지
}
}
'네트워크 캠퍼스 > JAVA' 카테고리의 다른 글
240109 다형성의 개요와 다형성이 없는 예제 실습 (0) | 2024.01.12 |
---|---|
240108 this(), super(), 접근 제한자, 캡슐화 (0) | 2024.01.11 |
240105 기본타입과 참조타입, 접근제한자와 상속, 오버라이딩과 오버로딩, this (2) | 2024.01.11 |
240104 클래스 예제, 패키지 예제 (0) | 2024.01.11 |
240102 Eclips 환경 구축, 자바 기본 사항, 주석문과 식별자 (1) | 2024.01.11 |