한 파일에 여러 클래스 작성
- 하나의 소스파일에 둘 이상의 클래스를 정의하는 것도 가능하다.
- 물론 하나의 소스파일에 하나의 클래스만을 정의하는 것이 보통임.
[주의사항]
- 소스파일의 이름은 public class와 일치해야 한다.
- 소스파일 내 public class가 없다면, 소스파일의 이름은 소스파일 내 어떤 클래스 이름으로 해도 상관 없음.
// 올바른 작성 예
// Hello2.java
public class Hello2 {}
class Hello3 {}
// Hello3.java
class Hello2 {}
class Hello3 {}
// 잘못된 작성 예
// Hello2.java
public class Hello2 {}
public class Hello3 {} //하나의 소스파일에 둘 이상의 public class가 존재해서는 안됨.
// Hello3.java
public class Hello2 {}
class Hello3 {}
// hello2.java
public class Hello2 {}
class Hello3 {}
객체배열
많은 수의 객체를 다뤄야 할 때, 배열로 다루면 편리할 것.
객체 역시 배열로 다루는 것이 가능하며, 이를 "객체 배열" 이라고 한다.
객체 배열 안에 객체가 저장되는 것은 아님.. "객체의 주소" 가 저장된다.
▶ 객체 배열 = 참조변수들을 하나로 묶은 참조변수 배열
// 참조변수 3개 선언
Tv tv1,tv2,tv3;
// 배열에 참조변수 3개를 저장.
Tv[] tvArr = new Tv[3];
길이가 3인 객체 배열 tvArr을 생성 시 각 요소는 참조변수의 기본값인 null로 자동 초기화 된다.
이 객체 배열은 3개의 객체의 각 주소를 저장.
tvArr[]이라는 객체를 생성해서 각 요소에 객체의 주소를 넣느 ㄴ것임.
위와 같이 선언 시 객체를 다루기 위한 참조변수들이 만들어진 것이다. (객체 저장 X)
객체를 생성해서 객체 배열의 각 요소에 저장하면 객체 배열 완성~~^^
Tv[] tvArr = enw Tv[3];
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();
// 또는 한줄로
Tv[] tvArr = { new Tv(), new Tv(), new Tv() };
// 다뤄야할 객체가 많다면?
Tv[] tvArr = new Tv[100]
for(int i=0;i<tvArr.length;i++){
tvArr[i] = new Tv();
}
선언 위치에 따른 변수의 종류
1. 클래스 변수: 클래스 영역. 클래스가 메모리에 올라갈 때 생성됨
- static을 사용하여 선언.
- 모든 인스턴스가 공통된 저장공간을 공유
2. 인스턴스 변수: 클래스 영역. 인스턴스가 생성되었을 때 생성됨.
- 각 인스턴스마다 별도의 저장공간
- 인스턴스마다 고유한 상태를 유지해야 하는 경우
3. 지역 변수: 클래스 영역 이외의 영역(메서드, 생성자, 초기화 블럭 내부). 변수 선언문이 수행되었을 때 생성됨.
참조형 반환타입
package ch6;
class Data3 { int x; }
public class Ex6_8 {
public static void main(String[] args) {
Data3 d = new Data3();
d.x=10;
Data3 d2 = copy(d);
System.out.println("d.x = "+d.x);
System.out.println("d2.x = "+d2.x);
}
// 새로운 객체를 생성할ㄴ 후 매개변수로 넘겨받은 객체에 저장된 값을 복사해서 반환.
// 매개변수 뿐만아니라 반환 타입도 참조형이 될 수 있다.
static Data3 copy(Data3 d) {
Data3 tmp = new Data3();
tmp.x = d.x;
return tmp;
}
}
Static 메서드와 인스턴스 메서드
메서드 앞에 static이 붙어있으면 클래스 메서드.
붙어있지 않으면 인스턴스 메서드이다.
클래스 메서드: 클래스 변수처럼 객체를 생성하지 않고도 '클래스이름.메서드이름' 식으로 호출 가능.
인스턴스 메서드는 반드시 객체를 생성해야만 호출할 수 있다.
클래스를 정의할 때, 어느 경우에 static을 사용해서 클래스 메서드로 정의해야 하는가?
클래스 = 데이터와 데이터 관련 메서드의 집합.
즉, 메서드 중 인스턴스와 관계없는 메소드를 클래스 메서드(static 메서드)로 정의한다.
# 클래스 영역에 선언된 변수를 멤버변수라고 함. 멤버변수 중 static이 붙은 것은 클래스 변수(static변수), 붙지 않은 것은 인스턴스 변수라고 한다.
# 멤버변수 = 인스턴스변수와 static변수를 통칭
Static을 붙여야 하는 경우
1. 클래스 설계 시 모든 인스턴스에 공통으로 사용하는 것
2. 클래스 변수(static변수)는 인스턴스를 생성하지 않아도 사용할 수 있다.
- static이 붙은 변수(클래스변수)는 클래스가 메모리에 올라갈 때 이미 자동적으로 생성되기 때문이다.
3. 클래스 메서드(static 메서드)는 인스턴스 변수를 사용할 수 없다.
- 인스턴스 변수는 인스턴스가 반드시 존재해야 사용 가능.
- 클래스메서드는 인스턴스 생성 없이 호출 가능하므로, 클래스 메서드가 호출되었을 때 인스턴스 존재하지 않을 수 있는 것임.
- 그러나 인스턴스 변수나 인스턴스 메서드는 static 붙은 멤버 사용하는 것 언제나 가능ㅋ
4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.
▶ 클래스의 멤버변수 중 모든 인스턴스에 공통된 값을 유지해야하는 것이 있는지 살표보고, 있다면 static을 붙이라.
▶ 작성한 메서드 중 인스턴스 변수가 인스턴스 메서드를 사용하지 않는 메서드에 static을 붙일 것을 고려.
'프로그래밍 > java' 카테고리의 다른 글
[JAVA] 다형성(polymorphism) (0) | 2022.08.28 |
---|---|
[JAVA] 패키지와 import, 제어자, 겟터와 셋터 (0) | 2022.08.28 |
[JAVA] 오버라이딩(overriding)과 참조변수 super, super() 생성자 (0) | 2022.08.27 |
[JAVA] 상속 (0) | 2022.08.26 |
[JAVA] 2차원 배열과 초기화 (0) | 2022.08.25 |