JAVA/공부

클래스 내부 구성 요소

GaeGim 2022. 7. 2. 23:42
반응형
  • 필드

필드 : 클래스에 포함된 변수. 객체 속성값 지정 가능. -> 클래스 중괄호에 포함 -> 힙에 저장

지역 변수 : 메서드에 포함된 변수. -> 메서드 중괄호에 포함 -> 스택에 저장

-> 둘이 어떤 중괄호에 포함되었는지에 따라 구분 가능

 

· 필드와 지역변수의 차이점

①. 생성되는 메모리 위치가 다르다.

스택 메모리에 저장되는 변수는 시간이 지나면 JVM이 알아서 삭제하지만

힙 메모리 객체 안에 저장되는 필드는 객체가 사라지지 않는 한 삭제되지 않는다.

- 어떠한 참조 변수도 객체를 가리키지 않을 때 객체가 삭제된다.

 

프레임 : 1개의 메서드 안에 선언된 모든 지역 변수들의 집합

 

 

②. 초깃값

필드는 초기화하지 않아도 강제로 초기화된다,

지역변수는 강제 초기화되지 않기 때문에 직접 초기화하지 않으면 저장공간이 빈 공간으로 있어 출력할 때 오류를 일으킨다. 

-> 메모리 유형의 차이에서 비롯되는 것이다,,

 

 

 

  • 메서드

메서드 : 클래스의 기능

메서드 정의 문법)

자바 제어자 리턴타입 메서드명 (입력매개변수) { //메서드 내용 }

public void int sum(int a, int b) {
    return a+b;
}

 

리턴타입 : 메서드 종료 이후 반환되는 값의 자료형

입력매개변수 : 메서드 호출 시 전달되는 값의 자료형과 전달받은 값을 저장할 지역 변수 정의

메서드 내용 : 메서드가 수행할 기능

 

 

※ 리턴 타입이 void일 때 return 키워드의 의미

void 리턴 타입은  리턴하지 않음을 의미하지만, return 키워드를 사용할 수 있다.

return이 메서드를 종료하라는 의미로 쓰이기 때문이다.

 

 

· 메서드 호출하기

 

- 클래스 외부에서 호출하기

메서드도 클래스 멤버이므로 객체 안에 있기 때문에 메서드를 쓰려면 객체를 먼저 생성해야 한다. 객체의 위치를 알고 있는 참조변수를 이용해 메서드를 호출한다.

 

메서드 소괄호에 입력매개변수가 있을 땐 해당 자료형의 값을 줘야 한다.

 

-클래스 내부에서 호출하기

클래스 내부에 있는 메서드끼리는 객체를 생성하지 않고 서로를 호출할 수 있다. 같은 멤버이기 때문.

필드도 멤버라 클래스 내 모든 메서드 안에서 객체를 생성하지 않고 자신이 속한 클래스 필드를 사용할 수 있다.

메서드에 static이 붙어있을 땐 static이 붙은 필드, 메서드만 호출가능하다.

 

 

- 입력매개변수가 배열인 메서드 호출

초깃값만 넘겨줄 때는 선언과 동시에 값을 대입할 때만 가능하다

int []a;
a={1, 2, 3};	//불가

public class A {
	public static void main(String[] args) {
    	int[] a;
		printArray({1, 2, 3});	//불가
        printArray(new int[] {1,2,3});	//[1,2,3]
    }
    public static void printArray(int []a) {
    	System.out.println(Arrays.toString(a));
    }
}

 

 

※ 기본 자료형 입력매개변수와 참조 자료형 입력매개변수의 차이

참조자료형이 입력매개변수일 땐 객체의 위치값이 전달되는 것이니 호출한 메서드, 호출된 메서드 모두 같은 객체를 보고있는 상황이다. 그래서 호출된 메서드에서 객체 값이 변경되면 호출한 메서드로 돌아오면 값이 바뀐다.

 

기본자료형을 입력매개변수로 전달하면 전달받은 메서드는 값을 복사해 사용한다. 

호출된 메서드에서 복사한 값으로 메서드 기능을 하고 다시 호출한 메서드로 돌아가면 값은 변하지 않는다. 호출된 메서드는 호출한 메서드의 필드를 건든 적이 없었기 때문이다.

 

 

 

· 오버로딩된 메서드

메서드 시그니처 : 메서드명, 입력매개변수의 자료형

메서드 시그니처가 다르면 동일 메서드명이여도 다른 메서드로 인식한다. 모두 동일하면 오버로딩 불가.

-> 입력매개변수에 따라 호출될 메서드가 선택됨.

 

 

 

· 가변길이 배열 입력매개변수

문법) 리턴타입 메서드명 (자료형... 참조변수명) { }

method1(1, 2);
method1(1, 2, 3);
method1();

public static void method1(int... values) {
//
}

가변 길이 배열 입력매개변수를 이용하면 단 한 개의 메서드만 정의해 모든 메서드 호출에 대응할 수 있다.

 

 

 

 

  • 생성자

생성자 : 객체를 생성하는 역할

 

작성 규칙

1. 반드시 클래스명과 동일한 이름으로 작성

2. 리턴타입 기재하지 않음

 

문법) 클래스명(입력매개변수) { // }

 

※ 컴파일러는 생성자가 없는 클래스를 만나면 자동으로 매개변수가 없는 기본 생성자를 추가해 준다. 기본 생성자 외 생성자가 있는 클래스라면 컴파일러는 기본 생생자를 추가해 주지 않는다.  이미 객체를 생성할 수 있기 때문이다.

 

 

· 생성자와 객체의 생성 방법

생성자의 모양에 따라 객체를 생성하는 방법이 결정된다. 생성자도 오버로딩 가능.

 

 

 

  • this 키워드와 this() 키워드

모든 사용할 수 있는 상태의 멤버는 항상 객체 속에만 존재한다.

클래스 내부에서는 어떻게 객체 생성 없이 필드와 메서드를 바로 사용할 수 있었을까?

 

사실 클래스 내부에서도 객체를 직접 만들지 않았을 뿐, 객체 안의 멤버를 참조변수명.멤버명 형태로 사용해왔다. 모든 메서드에는 자신이 포함된 클래스의 객체를 가리키는 this라는 참조변수가 있다. this를 생략하고 안쓰면 컴파일러가 자동으로 this.을 추가해준 것이다.

->지역변수는 멤버가 아니기 때문에 this.가 자동으로 붙지 않는다.

 

 

· this를 명시해줘야 할 때

지역변수명과 필드명이 같을 때 필드 앞에 this.을 붙여준다.

int a;	//필드
void init(int a) {	//생성자, 매개변수 a
	this. a = a;
}

 

 

 

· 클래스 내 다른 생성자를 호출하는 this()

자신이 속한 클래스 내부의 다른 생성자를 호출하는 명령.

 

※ this() 문법 규칙

1. 생성자 내부에서만 사용 가능

2. 생성자 첫 줄에 위치할 것

class A {
    A() {
	System.out.println("첫 번째 생성자");
    }
    A(int a) {
    	this();	//기본 생성자 호출
        System.out.println("두 번째 생성자");
    }
}

 

생성자의 주요 역할은 필드를 초기화 하는 것이다.

this() 메서드가 필요한 이유는 생성자 중복을 제거할 수 있기 때문이다.

 

class A {
int m1, m2, m3, m4;
    A() {
	m1=1;
	m2=2;
	m3=3;
	m4=4;
    }
    A(int a) {
   	this();		//A() 호출
    	m1=a;
    }
    A(int a, int b) {
   	this(a);	//A(int a) 호출
   	m2=b;
    }
}

 

 

 

 

반응형

'JAVA > 공부' 카테고리의 다른 글

자바 제어자-1  (0) 2022.07.02
클래스 외부 구성 요소  (0) 2022.07.02
클래스와 객체  (0) 2022.07.02
배열 성적 처리 프로그램  (0) 2022.06.26
제어문  (0) 2022.06.24