[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이다.
}
}
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은 제외