📚학습 내용
2주차에서는 객체 지향 프로그래밍 기초, 그 중에서도 객체 모델과 DTO, VO 와 접근제어자에 대한 개념을 학습했습니다.
객체 지향 프로그래밍 - 우리가 만들어보는 클래스의 종류
객체들은 자신의 역할이 정해져 있고 이런 의미로 객체를 설계할 때 모델을 만든다고 함
그렇게 때문에 클래스를 모델을 설계하는 도구라고 함
학습 목표 : 클래스로 만들 수 있는 모델의 종류와 사용하는 방법을 알아봄
모델(Model)이란 무엇인가
현실 세계에서 모든 데이터는 객체(Object)이고 프로그래밍에서는 객체를 클래스로 설계해서 사용한다.
소프트웨어 공학 부분에서는 이를 모델이라고 부른다.
우리가 클래스로 만들어 사용하게 될 모델의 종류
- 시작 모델
- ⭐ 데이터를 담는 (이동하는) 모델 → Data Transfer Object, Value Object
- ⭐ 데이터를 처리하는 모델 → Data Access Object → CRUD 기능 처리
- ⭐ 도움을 주는 모델 → Helper Object
DTO, VO 클래스가 왜 필요할까
- 데이터를 하나로 묶어야 될 경우
- example
- 자동차의 정보를 키보드로부터 입력 받아서 다른 메서드로 이동 해야 함
- 데이터베이스에 있는 데이터를 프로그램에서 가져와서 사용해야함
public class CarTest {
public static void main(String[] args) {
// 자동차의 정보를 [키보드로부터 입력] 받아서 [다른 메서드]로 이동
Scanner scan = new Scanner(System.in);
System.out.println("자동차 일련번호: ");
int carSn = scan.nextInt();
// 버퍼 비우기
scan.nextLine();
System.out.println("자동차 이름: ");
String carName = scan.nextLine();
System.out.println("자동차 가격: ");
int carPrice = scan.nextInt();
// 버퍼 비우기
scan.nextLine();
System.out.println("자동차 소유자 이름: ");
String carOwner = scan.nextLIne();
System.out.println("자동차 년식: ");
int carYear = scan.nextInt();
// 버퍼 비우기
scan.nextLine();
System.out.println("자동차 타입: "); // G(휘발유), D(경유)
String carType = scan.nextLine();
// 매개변수를 전달해줘야함
carInfoPrint(carSn, carName, carPrice, carOwner, carYear, carType);
}
// 매개변수로 자동차의 정보를 받아서 출력하는 메서드를 정의하세요
// 매개변수가 너무 많음!!!
// 자동차 데이터를 이동하기 위한 바구니가 필요함 (DTO, VO)
// 클래스로 CarDto, CarVO 모델 설계
public static void carInfoPrint(int carSn, String carName, int carPrice, String carOwner, int carYear, String carType) {
}
}
public class CarDto {
public int carSn;
public String carName;
public int carPrice;
public String carOwner;
public int carYear;
public String carType;
}
CarDto car = new CarDto();
car.carSn = carSn;
car.carName = carName;
car.carPrice = carPrice;
car.carOwner = carOwner;
car.carYear = carYear;
car.carType = carType;
carInfoPrint(car); // call by reference (번지를 주고 받음)
public static void carInfoPrint(CarDto car) {
System.out.println(car.carSn + ...)
}
정리
데이터를 다른 메서드로 이동 해야할 경우 DTO가 없으면 매개변수가 너무 길어지고 이 매개변수의 타입과 순서를 맞춰 주어야 하는 것이 굉장히 불편하다. 따라서 데이터를 하나로 묶어주는 DTO 클래스를 만들어서 사용한다.
DAO 클래스가 왜 필요할까
- 데이터베이스에 데이터를 저장, 수정하거나 검색, 삭제를 하기 위해서 만들어지는 클래스
- CRUD 동작을 갖고 있는 클래스, 비즈니스 로직을 처리하는 클래스
public class CarDao {
// C.R.U.D
// Create => insert(저장)
public void carInsert(CarDto car) {
// 데이터베이스 연결 후 insert sql 생성
System.out.println("car 정보가 db에 저장이 됨");
}
}
public class CarInsertTest {
public static void main(String[] args) {
// 자동차 정보를 키보드로부터 입력 받아서 db에 저장
// 스캐너는 위의 코드를 복사함
CarDao dao = new CarDao();
dao.carInsert(car); // car는 CarDto 타입
}
}
Utility 클래스는 왜 필요할까
- 반복적으로 사용해야 될 동작을 별도의 클래스로 만들어 놓고 필요할 때 사용하는 클래스
- 필수는 아니고 필요할 때 만들어서 사용하면 된다.
- 자바에서도 java.util 패키지에 이러한 Utility 클래스가 많이 있다.
- 날짜, 통화, 시간 정보 획득 기능
- 인코딩(한글 깨짐) 기능
- DAO 이외의 별도 기능 → main 메서드에서 분리해서 코딩함
public class CarUtilityTest {
public static void main(String[] args) {
// Car 정보를 출력하는 동작을 갖고 있는 Utility 클래스 설계
int carSn = 1110;
String carName = "BMW828i";
int carPrice = 90000000;
String carOwner = "홍길동";
int carYear = 2015;
String carType = "G";
CarDto car = new CarDto();
car.carSn = carSn;
car.carName = carName;
car.carPrice = carPrice;
car.carOwner = carOwner;
car.carYear = carYear;
car.carType = carType;
CarUtility carUtil = new CarUtility();
carUtil.carPrint(car);
}
}
public class CarUtility {
public static void carPrint(CarDto car) {
// 위의 코드와 동일
}
}
객체 지향 프로그래밍 - 객체를 접근하는 권한 이해하기
학습 목표 : 객체 상호 간에 접근을 제어할 수 있어야 한다. A, B 클래스가 갖고 있는 상태와 동작을 상호 간에 접근을 허용할 수 있어야 하고 접근을 막아야 하는 경우도 있다.
접근 제어란?
객체 상호 간에 접근 제어가 필요한 이유
: 클래스 내의 상태 정보는 중요하기 때문에 접근하지 못하게 하고(정보 은닉), 객체의 행위 정보는 상호 작용을 해야 하므로 접근을 허용한다.
public class PersonAccessTest {
// Person 클래스에 이름, 나이, 전화번호를 저장하고 출력
// 메모리에 Person 객체가 만들어짐(4 bytes) -> 인스턴스 주소에 삽입
Person p = new Person(); // 상태 정보가 모두 public
p.name = "홍길동";
p.age = 1000;
p.phone = "010-1234-1234";
System.out.println(p.name + "\\t" + p.age + "\\t" + p.phone);
// 나이가 1000이어도 출력이 됨
}
- 4가지 접근 제어자 (access modifier)를 사용한다.
- public - 모든 패키지에서 접근 가능
- private - 모든 패키지에서 접근 불가
- protected - 상속 관계에서 하위 클래스에서 상위 클래스 접근 가능
- default - 동일한 패키지에서만 접근 가능 (단어가 없음)
- 클래스를 설계할 때 고려해야 한다.
- 클래스와 클래스 내부에서 만들어지는 멤버에 접근 제어자를 사용할 수 있다.
- 클래스는 private 일 수 없음! → 클래스 사용 목적은 사용되기 위함이기 때문이다.
public class MemberDto {
public String name;
pricate int age;
public String phone;
// age 값을 넣고 싶으면 public 메서드를 생성해서 사용함
}
public class AccessModifier {
public static void main(String[] args) {
MemberDto dto = new MemberDto();
dto.name = "이름";
dto.phone = "010-1234-1234";
// private 인 age는 넣을 수 없음 <- 정보 은닉
// age는 접근 자체가 안되기 때문에 print 또한 할 수 없음
}
}
- class 를 정의할 때 앞에 접근 권한자를 사용하지 않으면 default 권한이 작동된다. 이는 같은 패키지에서만 사용할 수 있는 권한이 생기기 때문에 되도록 public으로 지정하는 것이 좋다.
패키지란 무엇인가
- 서로 기능이 비슷한 클래스들끼리 모아서 관리를 쉽게 하기 위해서 사용한다. (폴더 개념)
- 패키지 외부에서 클래스의 접근을 할 수 없도록 하기 위해서 사용한다. (보안 측면)
- 자바에서 제공해주는 API 또한 패키지의 형태로 배포된다.
- 자바에서 제공하는 대표적인 패키지들
- java.lang
- java.io
- java.uti 등
- javaSE 프로젝트 library(API) 위치 확인
- externel libraries (lib 안에 있는 jrt-fs.jar 파일)
- 자바에서 제공하는 대표적인 패키지들
클래스를 접근하는 이름
- 클래스를 접근하려면 만들어진 위치와 접근 제어를 알아야 한다.
- 패키지를 포함한 클래스 이름을 class full name 이라고 한다.
- String → java.lang.String
- System → java.lang.System
- import java.lang.*; 은 default package로 java.lang 안의 클래스들은 full name을 쓰지 않고 사용 가능함
- Scanner → java.util.Scanner
- BookDto → fc.java.model.BookDto
- MemberDto → fc.java.model.MemberDto
클래스를 접근하는 방법
- class full name 작성
- import 하기
🎓소감
이유는 모르고 남들이 사용하기에 dto를 사용했었는데 dto가 없을 경우에는 값을 받을 때 매개변수로 받아야 해서 변수의 타입과 순서, 개수를 고려 해주어야 해서 불편하다는 것을 몸소 느낄 수 있는 시간이었습니다.
접근 제어자 중에 protected가 동일한 패키지에서만 접근하는 것으로 잘못 알고 있었다는 것을 깨달았습니다. protected는 상속 관계에서 하위 클래스가 상위 클래스 접근할 수 있는 권한이고 default가 동일한 패키지에서만 접근이 가능한 권한입니다.
'🍫카카오 테크 캠퍼스 2기 BE' 카테고리의 다른 글
[카카오 테크 캠퍼스 / 2기] '웰컴 키트' 라는 것을 받다 (0) | 2024.05.14 |
---|---|
[카카오 테크 캠퍼스] 1단계 4주차 학습 일지 (0) | 2024.05.12 |
[카카오 테크 캠퍼스] 1단계 3주차 학습 일지 (1) | 2024.05.02 |
[카카오 테크 캠퍼스] 1단계 1주차 학습 일지 (0) | 2024.04.17 |
[카카오 테크 캠퍼스 2기 BE] 최종 합격 후기 (1) | 2024.04.17 |