Backend/Java

[Java] OOP 2 _Class, Field (접근제한자, 예약어, 멤버·클래스 변수)

Deeb 2021. 9. 7. 20:12

Class(클래스)

객체의 특성(속성, 기능)을 정의한 일종의 설계도이다.

클래스(설계도)와 객체(완성품)는 다르다 

 

1. 클래스 선언

[접근제한자] [예약어] class 클래스명 { 
}
[접근제한자] [예약어] class 클래스명  {}
     public     [예약어 생략]  class Student

=> 클래스 선언부, 클래스 시그니처
  • [] (대괄호) : 생략 가능(선택)
  • (소괄호) : 무조건 생략

🔎접근제한자

- 개발하는 프로젝트 내부에서 어디서든지 사용가능한 클래스 

: public, private

참고) public : 공공의, 누구나 접근 가능하다. 

 

🔎예약어

- 대괄호로 생략도 가능하다. 

: abstract, final이 예약어로 들어올 수 있다. 

 

🔎클래스명

: 항상 대문자로 시작

 

2. 클래스 접근제한자

public : 어디서든지 사용 가능
(default) : 해당 패키지 안에서만 사용 가능, ()안에 있기때문에 생략한다.

public class 클래스명 {
	// .............
}
class 클래스명 {
	// .............
}

class 클래스명 앞에 (deafult)가 생략되어있다. 


1) 접근 제한자 public

: 프로젝트 내에서 누구든지 해당 클래스를 접근하여 사용 가능 

package edu.kh.oop.classex1;

public class ClassTest1 {}

 

2) 접근 제한자 default

: 무조건 생략, 같은 패키지 안에서만 접근 가능

package edu.kh.oop.classex1;

class ClassTest2 {}

public을 지워도 괜찮은 이유 : class앞에 default 접근 제한자가 생략되어있어 안보이는 것.


예제

1. 패키지 동일한 경우

package edu.kh.oop.classex1;
 //패키지 동일 

public class ClassTestService1 {
	
	public void test() {
		//ClassTest1,ClassTest2 클래스를 얻어와 객체 생성하기
		
		ClassTest1 t1 = new ClassTest1(); 
		//public 클래스는 객체 생성 가능 => 같은 프로젝트 
				
		ClassTest2 t2 = new ClassTest2(); 
		// (default)도 생성 가능 => classex1이라는 같은 패키지 
	}
}​

2. 패키지 다른 경우 

package edu.kh.oop.classex2;

//다른 패키지에 존재하는 클래스인 경우 import 수행
import edu.kh.oop.classex1.ClassTest1;

//import edu.kh.oop.classex1.ClassTest2; 
// (default)라서 import 안된다.

public class ClassTestService2 {
	
	public void test() {
		//ClassTest1,ClassTest2 클래스를 얻어와 객체 생성하기
		
		ClassTest1 t1 = new ClassTest1(); // 접근제한자 public 문제없음
		// -> 같은 프로젝트라서 문제 없음
		
//		ClassTest2 t2 = new ClassTest2(); // (default) error!
		// 이유 : 패키지가 달라서, ClassTest2()가 저장된 패키지는 classex1이다.
	}

}​

Field (필드)

클래스에서 객체의 속성을 정의하는 부분

 

표현식

[접근제한자] [예약어] class 클래스명 {
         [접근제한자] [예약어] 자료형 변수명 [= 초기값];
}

[접근 제한자] [예약어] [자료형] 변수명 [=초기값];

예제

public class Academy { 
	public int temp1;
	protected int temp2;
	int temp3; //접근제한자 생략 시 (default)
	private int temp4; //캡슐화 원칙으로 private 사용
}​

 

🚩 1. 접근 제한자

private (+) < (default) (~) < protected (#) < public(-)

참고) 접근 가능한 범위가 클래스 접근제한자(public, (default))와 똑같다

protected(#) : 철창안에 가둔다는 식으로 외우기

 

  • 후손 클래스 : 상속에서의 부모 클래스와 자식 클래스 

필드에 직접적인 접근을 제한하고 private 한다 == 캡슐화

 

예제

public class FieldTest1 

public String test1 = "+";
public String test2 = "#";
/* (default) */ public String test3 = "~";
private String test4 = "-";
	
public void example1() {
		
	System.out.println( test1 );
	System.out.println( test2 );
	System.out.println( test3 );
	System.out.println( test4 );
		
}

같은 객체 내부여서 example1에서 에러가 안난다. 

 

package edu.kh.oop.field.ex1;

public class FieldTest2 {
	
	public void example1() {
		//FieldTest1 객체 생성
		
		FieldTest1 f1 = new FieldTest1();
		//public 클래스가 같은 패키지 내부이기때문에 가능
		
		//f1이 참조하는 객체의 필드를 출력
		
		System.out.println(f1.test1); // + f1이 참조하는곳의 test1을 출력
		System.out.println(f1.test2); // #
		System.out.println(f1.test3); // ~
		System.out.println(f1.test4); // - 
		// -> The field FieldTest1.test4 is not visible 
		// -> 같은 패키지 다른 클래스(객체)이기 때문에 private 접근제한자가 설정된 test4에 접근 불가
		
	}
}​

test4인 private만 출력이 안된다. 

 


2. 필드 예약어 static

(국가코드 예제)

1) final 

:하나의 값만 계속 저장해야 하는 변수에 사용하는 예약어 , 상수에서도 사용

 

2) static 

: 같은 타입의 여러 객체가 공유할 목적의 필드에 사용하며,

프로그램 start시에 정적 메모리(static) 영역에 자동 할당되는 멤버에 적용

public class Academy { 
	private static int temp1; 
}

 

🔎 Stack / Heap / static

 

✔ Stack, Heap

: 동적 메모리 영역, 코드 해석 시 메모리가 할당, 삭제되는걸 반복

✔ heap영역에서 gc가 메모리 공간을 확보하기위해 청소

 

✔ static: 정적 메모리 영역, 프로그램 시작~ 종료까지 계속 존재


3. 필드 세분화 (static이 붙는지 안붙는지로 구별)

🚩 1) 멤버 변수 == 인스턴스 변수 (static x)

  •  private String name;
  • 생성: new 연산자를 통해 Heap영역에 객체(instance)가 생성될 때
  • 소멸: 객체가 소멸될 때 같이 소멸
    => 객체 소멸 시점 : 어떠한 참조 변수에도 참조되지 않을 때 GC가 소멸 시킨다.

 

오브젝트 : (현실의) 객체

인스턴스 : (메모리 속의)객체

object를 new 연산자를 통해 instance로 변환

(참고) 클래스 내부에 작성되는 필드, 메소드를 통틀어 "멤버" 라고한다.   단, static은 제외

 

🚩 2) 클래스변수  == static 변수 (static o)

  • public static int nationalCode;
  • 생성: 프로그램 실행 시 Static 영역에 생성된다.
  • 소멸: 프로그램 종료 시 자동 소멸된다.

4. 필드  초기화 순서

(참고)초기화: 변수의 값에 맨처음 집어 넣는것

 

  • 인스턴스 블럭 ( { } ) - 인스턴스 변수를 초기화 시키는 블럭으로 객체 생성시 마다 초기화
  • - static(클래스) 블럭 ( static{ } )
  • - static 필드를 초기화 시키는 블럭으로 프로그램 시작 시 한 번만 초기화

 

{
	name = "봉국";
    id = "123456-2345667";
}​

➡ 이렇게 클래스 초기화 블럭으로 출력하면  name과 id의 초기값이 이렇게 되는데

private String name = "봉봉봉";
private String id = "123456-2345667";​

➡ 선언과 동시에 초기화하는게 조금 더 효율적이다.

 

초기화 블럭을 잘 쓰지 않는 이유

- 생성자가 인스턴스 초기화 블록의 값을 덮어씌워버리기때문에

써봤자 헷갈리기 때문에 초기화용 메소드가 낫다.

jvm 기본값: 명시적 초기화


final이 붙었을때의 의미

지역변수 : 상수

필드: public static final double PI = 3.14 상수

 

메소드 : 오버라이딩 불가한 메서드

클래스 : 상속 불가 , 마지막 클래스

 

반응형