✍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 상수
메소드 : 오버라이딩 불가한 메서드
클래스 : 상속 불가 , 마지막 클래스
'Backend > Java' 카테고리의 다른 글
[JAVA] 분기문_break, continue (0) | 2021.09.08 |
---|---|
[Java] OOP 3_Constructor(생성자) (0) | 2021.09.07 |
[Java] OOP 1_Object Oriented Programming(객체지향) (1) | 2021.09.06 |
[Java] Array(배열)_3 (배열 복사) (0) | 2021.09.03 |
[Java] 2차원 Array(배열) + 가변 배열/ 선언,할당,초기화 (0) | 2021.09.02 |