📚학습 내용
이번 주 학습 내용은 객체 지향 내용 중에서도 VO 클래스를 잘 설계하는 방법과 배열과 클래스의 관계, jvm이 메모리를 어떻게 관리하는지에 대한 강의를 들었습니다.
객체 지향 프로그래밍 - 잘 설계된 VO 클래스
학습 목표 : 어떻게 설계해야 VO 클래스를 잘 설계할 수 있을 지 학습
정보 은닉이란?
다른 객체에게 자신의 정보를 숨기고 자신의 동작, 기능, 연산만을 통해 접근을 허용하는 것, 클래스 외부에서 특정 정보에 접근을 막는다는 의미이다.
객체 모델링(설계) → 객체 생성 → 객체 사용(접근)
- public은 정보 은닉이 되어 있지 않아 어디서나 접근이 가능하다.
- private은 정보 은닉이 되어 있어 this로만 접근이 가능하다.
💡 필드 age를 public으로 지정할 경우, 5000이라는 말도 안되는 정보가 들어가도 정상적인 출력이 된다. 💡
setter, getter 만들기
은닉된 정보에 접근하는 방법 중 첫 번째 방법이다.
객체 모델링
public class PersonVO() {
private String name;
private int age;
private String phone;
// setter
public void setName(String name) {
this.name = name;
}
// getter
public String getName() {
return this.name;
}
}
객체 생성 및 사용(접근)
PersonVO p = new PersonVO();
p.setName("홍길동");
String name = p.getName(); -> "홍길동"
생성자 이용한 초기화
은닉된 정보에 접근하는 두 번째 방법이다.
생성자 메서드는 자기 자신이 갖고 있는 메서드이기 때문에 값을 넣는데 제약이 없다.
값을 가져올 때는 getter를 통해 가져온다.
public class PersonVO() {
private String name;
private int age;
private String phone;
// 객체 생성 후 초기화
public PersonVO() {
this.name = "홍길동";
this.age = 50;
this.phone = "010-1234-1234";
}
}
생성자를 작성하지 않았을 때는 생략된 default 생성자가 존재한다. ← 객체를 생성하는 메서드
생성자 메서드를 오버로딩해서 초기화할 수 있다.
이 때, 자바는 오버로딩된 생성자가 있으면 default 생성자를 생성하지 않는다.
public class PersonVO {
private String name;
private int age;
private String phone;
public PersonVO() {
// 초기화하지 않음
}
public PersonVO(String name, int age, String phone) {
this.name = name;
this.age = age;
this.phone = phone;
}
}
toString()으로 객체값 출력하기
객체가 갖고 있는 값 전체를 문자열 형태로 넘겨준다.
public String toString() {
return name + "\\t" + age + "\\t" + phone;
}
잘 설계된 VO 클래스
- 모든 상태 정보를 정보은닉하기 (private)
- 디폴트 생성자를 반드시 만들기 → 사용하든 하지 않든 만드는 것이 좋음
- 생성자 메서드를 오버로딩하여 객체 초기화하기
- setter 메서드 만들기
- getter 메서드를 만들기
- toString() 메서드 만들기
객체 지향 프로그래밍 - 배열과 클래스의 관계
배열과 클래스는 데이터를 담는 역할을 하는 것은 같지만 만들어지는 구조는 서로 다르다.
배열은 데이터를 담는 동일한 구조이며 클래스는 서로 다른 데이터를 담는 이질적인 구조이다.
동일한 구조와 이질적인 구조
// 배열 array
int[] arr = new int[6];
// 클래스 class
public class Student {
public String name;
public String dept;
public int age;
…
}
기본 배열과 객체 배열의 관계
// 기본 배열
// float 공간 연속적으로 4개 생성
float[] arr = new fload[4];
arr[0] = 10.66f;
arr[1] = 30.5f;
arr[2] = 34.25f;
arr[3] = 674.4f;
// 사용자 정의 배열
// Student 공간 4개 생성
Student[] std = new Student[4];
std[0] = new Student("홍길동", "컴공",
객체 지향 프로그래밍 - static과 jvm 메모리 모델
학습 목표 : static 키워드와 메모리 관계를 이해하고 JVM 에 사용하는 메모리 모델을 통해 자바 프로그램이 어떻게 구동되는지 원리를 학습하는 것
static과 메모리의 관계
메인 클래스는 왜 객체 생성 없이 실행이 되는가?
public class StaticTest {
public static void main(String[] args) {
System.out.println("Hello java");
}
}
메인 클래스가 동작하는 방식에 대해 이해해야 한다.
- JVM이 실행할 클래스를 찾는다.
- static 키워드가 붙어있는 멤버들을 정해진 메모리(static zone) 위치에 한 번 자동으로 로딩된다.
- static 멤버들은 클래스를 사용하는 시점에서 딱 한 번 메머리에 로딩된다는 점이 중요
- main() 메서드가 static이기 때문에 메모리에 자동으로 로딩
- JVM이 static-zone에서 main() 메서드 호출한다.
- 호출된 메서드를 call stack frame area (stack area) 에 push 한 뒤, 동작을 시작한다.
public clas StaticTest {
public static void main(String[] args) {
int a = 10;
int b = 20;
int sum = StaticTst.hap(a, b);
System.out.println(sum);
}
public static int hap(int a, int b) {
int v = a + b;
return v;
}
}
call stack frame area
- 메서드가 호출되면 호출된 기계어 코드가 push되고 실행되는 메모리 공간
- 현재 프로그램이 실행되고 있는 상태 파악 가능 - pc (program counter) 를 통해 알 수 있음
- LIFO 구조
- 이 곳에 아무것도 없으면 프로그램이 종료됨
static과 none static 멤버들의 접근 방법
static 접근 방법
public class StaticTest {
public static void main(String[] args) {
int a = 10;
int b = 20;
int sum = StaticTest.hap(a, b);
}
// 매개변수로 2개의 정수를 입력 받아 총합을 구해 리턴하는 메서드 정의
public static int hap(int a, int b) {
int result = a + b;
return result;
}
}
none static 접근 방법
public class NoneStaticTest {
public static void main(String[] args) {
int a = 10;
int b = 20;
// int sum = hap(a, b); // 같은 메모리에 올라와있지 않으므로 에러 발생
NoneStaticTest st = new NoneStaticTest(); // 생성자 메서드를 호출해서 메모리에 올림
int sum = st.hap(a, b);
}
// 메모리 static-zone에 hap이 올라가지 않음
public int hap(int a, int b) {
int result = a + b;
return result;
}
}
method area
- 메서드의 기계어 코드가 할당되는 메모리 공간
- static 멤버들이 할당되는 메모리 공간
heap area
- 객체가 생성되는 메모리 공간
static과 none static 멤버들의 접근 방법 (2)
static 멤버는 클래스를 사용하는 시점에서 자동으로 static-zone에 로딩된다.
따라서 new를 이용해서 객체를 생성하지 않고 static 메서드를 사용할 수 있다.
public class StaticAccess {
public static void main(String[] args) {
int a = 10;
int b = 20;
int sum = MyUtil.hap(a, b);
}
}
public class MyUtil {
public static int hpa(int a, int b) {
return a + b;
}
}
static이 아닌 경우 위의 내용과 동일하게 MyUtil 인스턴스를 생성하여 접근한다.
JVM이 사용하는 메모리 영역
JVM의 메모리 모델 (runtime data area)
- method area : 메서드의 바이트 코드가 할당되는 공간, static-zone, nonstatic-zone 으로 나눠짐
- heap area : 객체가 생성되는 메모리 공간 (new 연산자) Garbage Collector에 의해서 메모리 수집
- stack area / pc register : 메서드가 호출되면 메서드의 기계어코드를 할당받고 메서드가 실행되는 메모리 공간, PC에 의해서 현재 실행 중인 프로그램의 위치가 관리됨
- runtime constant pool : 상수값이 할당되는 메모리 공간, 문자열 중에서도 문자열 상수 저장 (literal)
🎓소감
vo 클래스를 설계할 때, 좋은 설계를 위해서는 private로 모든 필드를 정보 은닉하라고 하셨습니다. 이 이유에 대해서 강사님은 Person의 나이 필드인 age에 5000이라는 터무니 없는 값이 들어가도 값이 주입되는 문제를 언급하셨습니다.
setter를 사용해도 값이 입력되는 것은 똑같지 않나? 라는 생각을 했는데 setter와 같은 메서드로 접근하게 되면 입력된 매개변수를 if문을 이용하여 처리할 수 있어서 다름을 이해했습니다.
또한, 감으로만 알고 있던 static, none-static이 자바 메모리에 어떻게 로딩 되는지 알 수 있었던 시간이었습니다.
'🍫카카오 테크 캠퍼스 2기 BE' 카테고리의 다른 글
[카카오 테크 캠퍼스 / 2기] '웰컴 키트' 라는 것을 받다 (0) | 2024.05.14 |
---|---|
[카카오 테크 캠퍼스] 1단계 4주차 학습 일지 (0) | 2024.05.12 |
[카카오 테크 캠퍼스] 1단계 2주차 학습 일지 (1) | 2024.04.28 |
[카카오 테크 캠퍼스] 1단계 1주차 학습 일지 (0) | 2024.04.17 |
[카카오 테크 캠퍼스 2기 BE] 최종 합격 후기 (1) | 2024.04.17 |