개발자입니다
[비트캠프] 42일차(9주차2일) - Java(클래스) 본문
OOP
클래스 문법의 용도
① 메서드를 분류 : MemberHandler, Prompt
② 새 데이터 타입을 정의 : Score, Member
새 데이터 타입 정의
① 클래스 정의
class Score {
- → 인스턴스를 만들때 생성된다 = new 명령을 실행할 때 생성된다. "인스턴스 변수(field)"
}
② 레퍼런스 선언
Score obj; 에서 obj는 Score의 인스턴스 주소를 저장할 변수(reference).
③ 인스턴스 생성
obj = new Score(); 하면 설계도에 따라 변수를 Heap 영역에 만든다. name ~ aver 가 메모리에 만들어지고 인스턴스 주소 200이 obj에 저장된다. 이 메모리를 "Score의 인스턴스(instance)" 라 한다.
④ 인스턴스에 값 저장
obj.name = "홍길동" 하면 주소 200에 가서 name 변수에 "홍길동" 이 저장된다. (실제로는 "홍길동" 을 가진 인스턴스 주소가 저장)
클래스 정의의 위치
좌측 그림 : class Score { } 를 밖에 두면 class Test { }, class Test2 { }, class Test3 { } 에서 접근 가능하다. package 멤버 클래스라 한다.
중앙 그림에서 class Score { } 를 class Test { } 안에 두면 여기서만 접근 가능하고, class Test2 { }, class Test3 { } 에서 접근 불가하다.
우측 그림에서 class Score { } 를 void m1() { } 안에 두면 여기서만 접근 가능하고, void m2() { }, class Test2 { }, class Test3 { } 에서 접근 불가하다. 이를 Local class라 한다.
이렇게 class 안에 있는 class를 "Nested class"라 한다.
독립적으로 존재하는 class를 "package member class"라 한다.
인스턴스 생성, 레퍼런스, call by reference
Score s = new Score(); 하면 인스턴스 공간이 생성되고 그 주소 200이 s에 저장된다.
s.name ~ s.math 및 printScore(s) → 입력하면 인스턴스에 값 저장된다. s는 인스턴스의 주소이다.
메서드에서 인스턴스 생성 후 리턴
Score s = createScore("홍길동", 100, 100, 100); 하면 인스턴스 생성되고 값 입력 및 주소 200이 s에 저장된다.
printScore(s) 에서 s는 주소 200이다.
레퍼런스 배열 사용 전
Score s1, s2, s3; 하면 인스턴스 3개 생성되고 주소 200, 300, 400 이 저장된다.
레퍼런스 배열 사용 후
Score[] scores = new Score[3]; 에서 scores는 배열 레퍼런스, [3]은 레퍼런스의 배열이다.
Score 타입 배열 인스턴스 3개 만들어지고 주소 1700이 scores에 들어간다.
각 공간에는 Score() 인스턴스 주소 200, 300, 400이 들어간다.
인스턴스와 레퍼런스
Score s1 = new Score(); 에서 s1은 레퍼런스이며 인스턴스 주소 200이 저장된다.
Score s2 = s1; 하면 s1의 주소 200이 s2에 들어간다.
"Score의 인스턴스" = 객체 라 한다.
가비지(Garbage)
Score s1 = new Score(); 하면 인스턴스 생성되고 주소 200이 저장된다.
s1 = new Score(); 하면 인스턴스 생성되고 주소 300이 저장된다. 이때 주소 200의 인스턴스는 가비지가 된다. (주소를 갖고 있는 레퍼런스가 없을때)
인스턴스와 레퍼런스 카운트
Score s1 = new Score(); 하면 Score의 인스턴스가 생성된다.
Score s2 = new Score(); 하면 Score의 인스턴스가 새로 생성된다.
s2 = s1; 하면 s1의 주소가 s2에 저장되고 기존 s2에 있던 주소는 Garbage가 된다.
public 클래스와 default(package private class) 클래스
Exam0610에서 동일한 패키지에 있는 X<<default>>, Y<<public>> 는 접근 가능하다.
sub 패키지에 있는 X2<<default>>는 접근 불가하고 Y2<<public>>, Z2<<public>>은 접근 가능하다.
조언
*SI에서 CRUD 만드는 건 역량 향상이 안된다.
*자바 문제집은 문제 풀기보다 이 클래스에 이런 메서드가 있구나 이런걸 경험하는 걸로 활용하라
*언어별 관례를 섞지 말라.
과제
/
'네이버클라우드 AIaaS 개발자 양성과정 1기 > Java' 카테고리의 다른 글
[비트캠프] 43일차(9주차3일) - Java(리팩토링: 데이터 타입 정의로써 클래) (0) | 2023.01.04 |
---|---|
[Java] 예제 소스 정리 - 클래스(인스턴스, public, default, 중첩 클래스) (0) | 2023.01.03 |
[비트캠프] 41일차(9주차1일) - Java(메서드) (0) | 2023.01.02 |
[Java] 예제 소스 정리 - 콘솔 출력 (1) | 2022.12.30 |
[Java] 예제 소스 정리 - 메서드(개념, 가변 파라미터, 배열 파라미터, call by value, call by reference, main(), JVM 아규먼트) (0) | 2022.12.30 |