<오늘의 학습>
1. static / non-static
2. static / final
3. 클래스 안에서 this() 이용
4. 상속과 접근 제한자
5. 상속과 super() 호출
1. static / non-static
▶ static 멤버
- 객체를 생성하지 않아도 사용이 가능하다.
- 객체마다 생기는 것이 아니고, 클래스당 하나만 생성되는 공간적 특성을 가지고 있다. (객체 내부가 아닌 별도의 공간에 생성되기 때문이다.)
- static 멤버들은 클래스가 로딩될 때 공간이 할당되는 시간적 특성을 가진다. 객체가 생기기 전에 이미 생성이 되어 객체가 생기기 전에도 사용이 가능하다. 객체가 사라져도 멤버는 사라지지 않으며 프로그램이 종료될 때 사라진다.
- static 멤버들은 동일한 클래스의 모든 객체에 의해 공유된다.
- 클래스 멤버라고도 부른다.
▶ non-static 멤버
- 멤버들은 객체마다 독립적으로 별도 존재하는 공간적 특성을 가지고 있다.
- 객체가 생길 때 생성되기 때문에 객체가 생성된 뒤에 사용할 수 있다. 객체가 사라지면 멤버도 사라진다.
- 멤버들은 각각의 공간을 유지하기 때문에 다른 객체에 의해 공유되지 않는다. (배타적)
- 인스턴스 멤버라고도 부른다.
▶ 예제) static 변수와 non-static 변수를 StaticClass에 넣고, main문에서 값을 바꿔꾸며 비교해 보자.
▷ StaticClass 코드
public class StaticClass {
static int staticNum;
int nonStaticNum;
}
▷ main 코드
StaticClass.staticNum=10;
System.out.println("StaticClass.staticNum:"+StaticClass.staticNum);
System.out.println(); //줄바꿈
StaticClass obj = new StaticClass();
obj.staticNum=30;
System.out.println("StaticClass.staticNum:"+StaticClass.staticNum);
System.out.println("obj.staticNum:"+obj.staticNum);
▷ 출력 결과
StaticClass.staticNum:10
StaticClass.staticNum:30
obj.staticNum:30
- static 변수는 클래스 당 하나로 공동으로 사용된다. 객체로 접근하더라도 최종적으로 수정된 30으로 출력된다.
▶ 위 예제에서 staticClass 객체를 하나 더 생성하여 값을 출력해 보자.
▷ main 코드
StaticClass obj2 = new StaticClass();
obj2.staticNum=100;
obj.nonStaticNum=20;
obj2.nonStaticNum=200;
System.out.println("StaticClass.staticNum:"+StaticClass.staticNum);
System.out.println("obj.staticNum:"+obj.nonStaticNum);
System.out.println("obj2.staticNum:"+obj2.nonStaticNum);
▷ 출력 결과
StaticClass.staticNum:100
obj.staticNum:20
obj2.staticNum:200
- staticNum의 값은 최종적으로 수정된 100으로 출력된다.
- non static 변수는 독립적이기 때문에 각각 가지고 있는 값이 출력된다.
2. static / final
▶ static 활용
- 전역 변수와 전역 함수를 만들 때 활용한다. 전역변수나 전역 함수는 static으로 클래스에 작성한다.
- 모든 필드와 메소드가 public static으로 선언되면 다른 모든 클래스에서 사용할 수 있다.
- 공유 멤버를 작성할 때, static 필드나 메소드는 하나만 생성하여 클래스의 객체들을 공유한다.
- static 멤버를 가진 클래스 사례 : Math 클래스 : java.lang.Math
▶ static 메소드의 제약 조건
static 메소드는 non-static 멤버에 접근할 수 없다. 객체가 생성되지 않은 상황에서도 static 메소드는 실행될 수 있기 때문에 non-static 메소드와 필드를 사용할 수 없다. 반대로 non-static 메소드는 static 멤버 사용이 가능하다.
static 메소드는 this 레퍼런스를 사용할 수 없다. static 메소드는 객체가 생성되지 않은 상황에서도 호출이 가능하므로, 현재 객체를 가리키는 this를 사용할 수 없다.
▶ final
static과 final는 주로 함께 이용된다.
final 필드 : 상수를 선언할 때 사용한다. 상수 필드는 선언 시에 초기 값을 지정하여야 하며, 실행 중에 값을 변경할 수 없다
final 클래스 : 클래스 상속을할 수 없게 한다.
final 메소드 : 오버라이딩을 할 수 없게 한다.
▶ 예제) static으로 작성된 전역 함수
▷ Calc 코드
public class Calc {
public static int abs(int num){
return (num>0)?num:-num;
}
public static int min(int num1, int num2){
return (num1>num2)?num2:num1;
}
public static int max(int num1, int num2){
return (num1>num2)?num1:num2;
}
public static double max(double num1, double num2){
return (num1>num2)?num1:num2;
}
public static String strMax(String s1, String s2){
return (s1.length()>s2.length())?s1:s2;
}
}
▷ main 코드
public static void main(String[] args) {
System.out.println("절댓값:"+Calc.abs(-5));
System.out.println("최솟값:"+Calc.min(4,8));
System.out.println("최댓값:"+Calc.max(-4,8));
System.out.println(); //줄바꿈
System.out.println("실수의 최댓값:"+Calc2.max(1.5, 2.5));
System.out.println("긴 문자열:"+Calc2.strMax("test", "test123"));
}
- static으로 작성된 전역 변수나 함수는 객체를 생성하지 않아도 접근이 가능하다.
▷ 출력 결과
절댓값:5
최솟값:4
최댓값:8
실수의 최댓값:2.5
긴 문자열:test123
3. 클래스 안에서 this() 이용
- this()나 super()는 클래스의 첫 번째 줄에 작성해야 한다.
▶ 예제) this와 this()를 이용한 코드
public class Human {
private String name;
private String area;
private String phone;
private int age;
Human(String name){
this(name,"알수없음","알수없음",0);//중복된 내용을 작성하지 않을 수 있다.
}
Human(String name, String area){
this(name,area,"알수없음",0);
}
Human(String name, String area, String phone){
this(name,area,phone,0);
}
Human(String name, String area, String phone, int age){
this.name=name;
this.area=area;
this.phone=phone;
this.age=age;
}
}
4. 상속과 접근 제한자
▶ 상속
- 부모클래스에 만들어진 필드, 메소드를 자식클래스가 물려받는다.
- 동일한 특성을 재정의할 필요가 없어 자식 클래스가 간결해진다.
- 클래스들의 계층적 분류가 가능하며 클래스 관리에 용이하다.
- 소프트웨어의 생산성이 향상된다.
▶ 접근 제한자
접근 제한자 | 접근 범위 | 동일 클래스 | 동일 패키지 | 다른 패키지의 자식 클래스(상속) | 다른 패키지 |
public | 접근제한 없음 | O | O | O | O |
protected | 동일 패키지 상속받은 클래스 내부 |
O | O | O | |
default | 동일 패키지 내에서만 접근 가능 | O | O | ||
private | 동일 클래스 내에서만 접근 가능 | O |
5. 상속과 super() 호출
▶ 예제) 상속을 이용한 생성자 호출
▷ TV2 클래스 코드
public class TV2 {
TV2(){
System.out.println("TV 기본 생성자");
}
TV2(int size){
System.out.println("TV 파라미터 생성자");
}
}
▷ TV2를 상속받는 ColorTV 클래스 코드
public class ColorTV extends TV2{
ColorTV(){
System.out.println("ColorTV 기본 생성자");
}
ColorTV(int size, int color){
System.out.println("ColorTV 파라미터 생성자");
}
}
▷ main 코드
ColorTV hiTV = new ColorTV();
▷ 출력 결과
TV 기본 생성자
ColorTV 기본 생성자
- ColorTV 의 생성자를 호출하면 상속받는 TV2의 기본 생성자가 호출된다.
- 서브 클래스의 생성자 맨 위에 super(); 가 생략된 형태이며, super(파라미터)를 이용하여 명시적으로 슈퍼 클래스의 생성자를 선택할 수 있다.
▶ 위 main 코드를 수정하여 ColorTV 파라미터 생성자를 호출해 보자.
▷ main 코드
ColorTV hiTV = new ColorTV(32,1024);
▷ 출력 결과
TV 기본 생성자
ColorTV 파라미터 생성자
- ColorTV 의 파라미터 생성자를 호출하더라도 TV2는 기본 생성자가 호출된다.
- TV 파라미터 생성자를 호출하고 싶다면 아래 예제를 계속 확인해 보자.
▶ ColorTV 클래스 코드를 수정하여 TV2 파라미터 생성자를 호출해 보자.
▷ ColorTV 클래스 코드
ColorTV(int size, int color){
super(5);
System.out.println("ColorTV 파라미터 생성자");
}
- 호출하려는 생성자 맨 위에 super(파라미터 정수 5); 를 추가하면 작성한 파라미터와 매치되는 파라미터 생성자를 호출한다.
▷ 출력 결과
TV 파라미터 생성자
ColorTV 파라미터 생성자
2023년 5월 31일 수요일
<13일차 수업 후기>
클래스를 작성할 때 보안을 위해 private를 많이 사용하고, 설정자(setXXX)와 접근자(getXXX)를 이용한 간접 접근을 많이 이용한다고 배웠다. 실무에서 주로 사용하는 방법이라고 하니 꼭 기억해야겠다.
'HRD_훈련 > JAVA' 카테고리의 다른 글
[JAVA] 오버라이딩과 오버로딩, 연결 리스트 (14일차) (0) | 2023.06.01 |
---|---|
[JAVA] 업캐스팅, 다운캐스팅, instanceof (14일차) (0) | 2023.06.01 |
[JAVA] 클래스 실습 (12일차) (0) | 2023.05.30 |
[JAVA] 배열과 정렬 실습 (11일차) (0) | 2023.05.28 |
[JAVA] 반복문과 배열, 랜덤 함수 실습 (10일차) (0) | 2023.05.25 |