새소식

인기 검색어

개인공부/Java

접근지정자

  • -

클래스 접근 지정자

클래스에서는 public, default 접근 지정자만 사용할 수 있다.

즉, 일단 다른 패키지에서 클래스를 사용하기 위해서는 해당 클래스를 임포트 할 수 있어야 하므로 public으로 선언해야 하는 것이다.

 

클래스 접근 지정자와 생성자 접근 지정자의 연관성

클래스에 생성자가 없을 떄 컴파일러는 기본 생성자를 자동으로 추가한다고 했다. 이 떄 자동으로 추가되는 생성자의 접근 지정자는 클래스의 접근 지정자에 따라 결정된다.

package abc.bcd

public class A{ 	public 클래스
	public A(){}	public 생성자	
}
//클래스와 생성자에 모두 public 접근 지정자가 이기에 
//다른  패키지에서 클래스를 임포트하거나 생성자를 호출 할 수 있다

package abc.bcd

class A{ 			default 클래스
	//public A(){}	컴파일러가 class의 접근지정자에 맞춰 default 생성자를 생성
}
//클래스와 생성자에 모두 default 접근 지정자 이기에
// 생성자는 클래스 내부에 존재하고 다른 패키지에서 클래스를 임포트를 할수 없어 생성자를 호출 할 수 없다

package abc.bcd

public class A{ 			public 클래스
	default A(){}		    default 생성자를 생성
}
//클래스는 public 접근 지정자이지만 생성자는 default생성자 이기에
//다른 패키지에서 클래스를 임포트할 수 있지만, 생성자를 호출 할 수 없으므로 객체 자체를 생성할 수 없다.

 

static 제어자

static은 클래스의 멤버(필드, 메서드, 이너클래스)에 사용하는 제어자이다.

이제까지 클래스의 멤버를 다른 클래스 내에서 사용하기 위해서는 가장 먼저 클래스의 객체를 생성해야 한다고 했다.

이렇게 객체 안에 있을 떄 사용할 수 있는 상태가 되는 멤버를 인스턴스 멤버라고한다.

반면 앞에 static이 붙어 있는 멤버를 정적멤버라고 한다.

 

인스턴스 필드와 정적 필드의 사용방법은 다소 다른데, 그 이유는 저장공간의 위치 떄문이다

class A {
	int m = 3;
	static int n = 5;
}

인스턴스  필드인 m의 저장 공간은 객체 내부에 생성되므로 m을 사용하기 위해서는 반드시 객체를 먼저 생성해야 한다. 또한 저장공간이 힙 메모리에 위치하므로 반드시 해당 저장 공간에 값을 읽거나 쓰기 위해서는 참조 변수명을 사용해야한다. 반면 정적 필드인 n은 클래스 내부에 저장 공간을 지니고 있기 떄문에 객체 생성 없이 바로 사용 할 수 있다.이떄 특이한 점은 객체 내부에도 정적 필드인 n이 존재한다는 것이다. 다만 n의 실제 저장 공간은 static영역 내부에 있으며, 객체 내부의 n은 실제 static필드의 저장 공간의 참조값만을 포함하고 있다. 따라서 인스턴스 필드처럼 참조 변수명으로도 사용 가능하다 정적 필드의 특징은 바로 정적필드는 객체 간 공유 변수의 성질이 있다 

인스턴스 메서드와 정적 메서드

인스턴스 메서드와 정적 메서드는 모두 메모리의 첫 번쨰 영역에 위치한다 다만, 인스턴스 메서드는 인스턴스 메서드 영역, 정적 메서드는 클래스 내부에 존재한다

 

static 메서드 안에서 사용할 수 있는 필드와 메서드static 메서드 내에서는 static 필드 또는 static 메서드만 사용할 수 있다. 그 이유는 static 멤버(static 필드, static 메서드)는 객체 생성 없이 실행될 수 있어야 한다. 하지만 인스턴스 멤버는 반드시 객체를 생성한 후에 사용할 수 있다. 만일 정적 메서드 내에서 인스턴스 멤버를 사용한다면 결국 정적 메서드도 객체를 생성한 후에 동작할 수 있을 것이다. 따라서 객체 생성 이전에 실행하려면 내부에는 객체 생성이전에 사용할 수 있는 요소들로만 구성돼 있어야 한다. 이것이 바로 정적 메서드 내부에 정적 멤버만 올 수 있는 이유다.

 

static main() 메서드

프로그램이 실행되면 제일 먼저 호출되는 메서드이기 때문 객체를 생성하지 않은 채로 바로 작업을 수행해야 하기 때문에 static이어야 합니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

객체

'개인공부 > Java' 카테고리의 다른 글

클래스의 상속과 다형성  (0) 2022.07.19
트리  (0) 2022.07.19
클래스 외부 구성 요소(패키지와 임포트)  (0) 2022.07.18
내부 객체 참조 변수명인 this  (0) 2022.07.18
메서드 오버로딩  (0) 2022.07.18
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.