728x90
반응형

<오늘의 학습>

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)를 이용한 간접 접근을 많이 이용한다고 배웠다. 실무에서 주로 사용하는 방법이라고 하니 꼭 기억해야겠다.

728x90
반응형

+ Recent posts