https://opentutorials.org/course/1223/5531
07-1 패키지 (Package)
- 패키지(Package) 란?
이유는 모르고 지금까지 당연하게 생성하고 사용해온 패키지는 무엇일까?
점프투자바에서는 '비슷한 성격의 자바 클래스들을 모아 넣는 자바의 디덱토리' 라고 설명하고 있고,
생활코딩에서는 '하나의 클래스 안에서 같은 이름의 클래스들을 사용하기 위한 방법, 클래스가 많아짐에 따라서 같은 이름을 가진 클래스가 생겨날 가능성이 높아지게 되는데 이름의 충돌을 방지하기 위해 고안된 것' 이라고 설명하고 있다.
패키지를 이용하면 다음과 같은 이점이 있다.
- 클래스의 분류가 용이하다. (비슷한 것 끼리 묶는다.)
- 패키지가 다르다면 동일한 클래스명을 사용할 수 있다.
- 패키지 사용하기
서로 다른 패키지에 있는 클래스를 사용하려면 import를 통해서 다른 패키지의 클래스를 불러와야한다.
* 을 이용하면 해당 패키지 내의 모든 클래스를 import 하게 된다.
ex)
import jump2java.house.*
https://www.opentutorials.org/course/1223/6061
07-2 접근제어자 (Access Modifier)
객체 안에 소속되어있는 멤버들(메서드,변수...)을 사용하는 입장에서 누가 이것을 사용할 수 있는가에 대한 권한에 차등을 주는 것.
- private : 해당 클래스만 접근 가능
- default : 접근제어자를 별도로 설정하지 않을 때, 해당 패키지 내에서 접근 가능
- protected : 동일 패키지의 클래스 또는 해당 클래스를 상속받은 다른 패키지의 클래스에서만 접근 가능
- public : 모든 클래스에서 접근 가능
private -> default -> protected -> public 순으로 보다 많은 접근을 허용한다
07-3 정적 변수와 메소드 (static)
메인 메소드를 사용하다보면 static을 보게된다. 보통 static은 변수나 메소드 앞에 static 키워드를 붙여서 사용하게 된다
- static 변수 (클래스 변수)
클래스를 만들고 new연산자로 객체를 생성하면, 객체가 생성될 때마다 새로운 메모리에 할당하게 된다.
이럴 때 static키워드를 붙이면 자바는 메모리 할당을 딱 한번만 하게 되고, 메모리 할당 후 프로그램이 종료될 때까지 유지되기 때문에 메모리 사용에 이점을 볼 수 있게된다.
static을 사용하는 또 한가지 이유로 공유의 개념을 들 수 있다. static 으로 설정하면 같은 곳의 메모리 주소만을 바라보기 때문에 static 변수의 값을 공유하게 되는 것이다.
※클래스 변수와 인스턴스 변수와의 차이?
인스턴스 변수는 객체 생성 시마다 매번 새로운 변수가 생성되고, 서로 공유되지 않는다.
- static 메소드
static 메소드 안에서는 인스턴스 변수를 사용할 수 없다.
static에 대해 잘 정리된 글을 발견해서 정리해보았다.
- 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통적으로 사용해야하는 것에 static을 붙인다.
인스턴스를 생성했을 때 각 인스턴스들은 서로 각각의 공간에 담기기 때문에 독립적인 값을 갖는데, static을 붙이면 위에서 말했듯이 같은 메모리 주소를 바라보기때문에 인스턴스들이 값을 공유할 수 있게된다.
- static이 붙은 멤버변수는 인스턴스를 생성하지 않아도 사용할 수 있다.
static이 붙은 멤버변수(클래스변수)는 클래스가 메모리에 올라갈때 이미 자동적으로 생성되기 때문이다.
이해가 안됐던 부분!
※인스턴스를 생성하지 않아도 사용할 수 있다?
인스턴스를 생성한다는 말은 new 키워드로 접근하는 것. 생성될 때마다 새로운 메모리가 할당되는데 static 변수는 생성될 때 이미 한번에 메모리에 올라가기 때문에(= 클래스가 메모리에 올라갈때 이미 자동적으로 생성되기 때문) 인스턴스를 생성하지 않아도 된다!
class Card {
String kind ; // 카드의 무늬 - 인스턴스 변수
int number; // 카드의 숫자 - 인스턴스 변수
static int width = 100 ; // 카드의 폭 - 클래스 변수
static int height = 250 ; // 카드의 높이 - 클래스 변수
}
class CardTest{
public static void main(String args[]) {
// 클래스변수(static 변수)는 객체생성없이 '클래스이름.클래스변수'로 직접 사용 가능하다.
System.out.println("Card.width = " + Card.width);
System.out.println("Card.height = " + Card.height);
Card c1 = new Card(); // 인스턴스 생성
c1.kind = "Heart";
c1.number = 7;
Card c2 = new Card();
c2.kind = "Spade";
c2.number = 4;
위 예제에 쓰여있는 것처럼 static 변수는 객체(인스턴스) 생성 없이 '클래스이름.클래스변수'로 직접 사용이 가능하다.
- static이 붙은 메소드에서는 인스턴스 변수를 사용할 수 없다.
static 메소드는 인스턴스 생성없이 접근하는 메소드인데, 인스턴스 변수는 객체가 생성된 이후에 메모리에 할당이 된다고 했다. static 메소드에서 인스턴스 변수를 사용한다는 말은 메모리에 할당되지 않은 변수를 이용하겠다는 말이 되므로 불가능하다. 따라서, static 메소드에서는 이미 메모리에 할당이 되어있는 static 변수만 사용이 가능하다.
- 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.
- 메서드의 작업내용중에서 인스턴스 변수를 필요로 한다면, static을 붙일 수 없다. 반대로 인스턴스변수를 필요로 하지 않는다면, 가능하면 static을 붙이는 것이 좋다. 메서드 호출시간이 짧아지기 때문에 효율이 높아진다. (static을 안붙인 메서드는 실행시 호출되어야할 메서드를 찾는 과정이 추가적으로 필요하기 때문에 시간이 더 걸린다.)
- 클래스 설계시 static의 사용지침
- 먼저 클래스의 멤버변수중 모든 인스턴스에 공통된 값을 유지해야하는 것이 있는지
살펴보고 있으면, static을 붙여준다.
- 작성한 메서드 중에서 인스턴스 변수를 사용하지 않는 메서드에 대해서 static을
붙일 것을 고려한다.
※ main 메소드에서 static을 붙이는 이유?
main 메소드는 프로그램을 실행할 때 가장 기본이 되는 메소드이다. 프로그램을 실행하려면 시작점인 main()이 메모리에 올라가 있어야하기 때문에 static을 붙여서 일단 메모리에 전부 올려놓고 시작하기 위함이다.
참조!
https://velog.io/@sparkbosing/Java-Main에-static을-사용하는-이유-추상-클래스-vs-인터페이스
'Study > JAVA' 카테고리의 다른 글
[JAVA] 클래스의 구성 멤버 (0) | 2021.11.10 |
---|---|
[JAVA] 데이터 타입(원시 타입, 참조 타입)과 메모리 사용영역 (0) | 2021.11.08 |
[JAVA] 숫자와 문자열 간의 형 변환 (0) | 2021.11.05 |
[점프투자바] 05 객체지향 프로그래밍 05-6 인터페이스 (0) | 2021.11.03 |
[JAVA] 전달인자(Argument)와 매개변수(Parameter) (0) | 2021.11.02 |