회원관리 바닐라 자바로 만들기 comprehensive (2)

Hailey·2025년 2월 22일

JAVA

목록 보기
4/8
post-thumbnail

service 계층 전 후에 같은의미지만 쓰는 단어가 다르다!
굳이 안지켜도 되지만 참고..

service 전에는 find, regist , modify, remove
service 후에는 db와 관련 된 것은 select, insert, update, delete

참고) 처음에 static을 보면 static먼저 인지한다!!

의미 : static은 클래스 레벨로 만들어지기 때문에, 모든 객체/인스턴스가 공유하는 메소드/변수다.

(이유: 객체가 만들어지기전에 static 이 먼저 저장되므로 객체생성여부와 모든 객체와 관련없이 공유된다)

1. 오늘의 목표

 ArrayList<Member> findMembers = mr.selectAllMembers();

를 설명하기!

컬렉션 - List 인터페이스 - ArrayList 클래스

컬렉션이란?

: 클래스의 집합 / 자료구조의 집합

ArrayList란?

: 클래스다!
: 자바의 컬렉션 프레임워크에서 List 인터페이스의 구현체가 ArrayList클래스이다.

  • List 인터페이스의 대표적인 구현체 두 가지:
  1. ArrayList: 내부적으로 배열로 데이터를 저장 → 검색 속도가 빠름 (인덱스로 접근할 때)
  2. LinkedList: 연결 리스트 구조로 데이터를 저장 → 삽입/삭제 속도가 빠름

제네릭이란?

자바에서는 다음과 같은 것들을 제네릭 타입으로 사용할 수 있습니다:

  1. 클래스 타입: String, Member
  2. 래퍼 클래스: Integer, Double(기본 자료형의 객체버전/박싱)
  3. 사용자 정의 타입: CustomObject (직접만든 클래스)
  4. 인터페이스

자바에서는 클래스 = 타입이라고 볼 수 있다.

ArrayList<String> → 문자열(String)만 저장 가능
ArrayList<Integer> → 정수(Integer)만 저장 가능
ArrayList<Member> → 직접 정의한 Member 객체만 저장 가능

즉, 내가 생각했던 일반적인 객체 생성과는 다르다.

Member member1 = new Member();  // Member 타입의 객체 생성

중간에 타입 안에 타입이 더 들어간다!

ArrayList <Member> findMembers = mr.selectMembers(); 

그래서 첫 목표 코드를 해석해보면,
mr.selectAllMebers()메서드가 반환하는 값은


ArrayList <Member>
  

타입의 객체 여야하고, 이들은 findMembers에 저장됩니다.

findMembers는 Member 타입을 저장할 수 있는 ArrayList 타입의 변수입니다.


2. 오늘의 목표

private final ArrayList<Member> memberList = new Arraylist<>(); 

설명하기.

private

: 해당 클래스 내에서만 사용할 목적이면 private 접근제어자를 붙일 수 있다.

따라서, private final은 해당 클래스 안에서만 쓰고 final(재할당하지 않는, 오로지 하나만 존재하는) 객체를 만든다는 뜻이다.

ArrayList는 내부적으로 생성자에 <>가 지정이 되어있어서 다른 객체생성자들 쓰는 것과는 다르게, ArrayList()가 아닌, new ArrayList<>();를, 즉 <>제네릭을 써야한다.

업로드중..
새로운 ArryayList객체를 생성하여 ArrayList<멤버>타입으로 반환하여 memberList에 저장한다. 이 때 memberList는 클래스 내부에서만 사용할 수 있고, 객체는 초기화 이후 재할당되지않는, 즉 딱 한번만 생성된다.

Serializable이란?

직렬화(Serializable): "객체"의 상태를 바이트 스트림으로 변환하는 과정

: 객체를 파일에 저장하거나 네트워크로 전송할 때 사용됩니다.

: 저장하거나 전송하기 위해서는 무조건 사용해야함 (바이트로 변환해야하기 때문이다.)

OutputStream 추상 클래스의 하위 클래스들

java.lang.Object
↳ java.io.OutputStream (추상 클래스, 기반 클래스)
↳ FileOutputStream (파일에 바이트를 씀)
↳ FilterOutputStream (다른 스트림에 기능 추가)
↳ BufferedOutputStream (버퍼를 통한 성능 향상)
↳ ObjectOutputStream (객체 직렬화 기능 추가)

OuputStream이 바이트 기반 출력스트림인것은 알고 있었지만, 이것이 클래스라는 것 에 대한 인지가 없었다. OutputStream은 추상클래스이기 때문에, 우리는 이를 상속한 하위클래스들을 사용한다.

  1. FileOutputStream : 파일에 직접 데이터를 바이트로 기록

  2. BufferedOutputStream: 버퍼링 기능 >> 메모리에 임시 저장 후 한 번에 출력(성능향상)

3. ObjectOutputStream : 객체 직렬화 >> 객체를 바이트로 변환해 저장

private final File file =
new File("src/main/com/......"); //Final클래스 이용하여 final 객체 생성

ObjectOutputStream oos = null;
oos = new ObjectOutputStream(
	  new BufferedOutputStream(
    		new FileOutputStream(file)
            )
        );

FileOuputStream에서 이미 바이트로 저장한것 아닌가?
왜 ObjectOuputStream을 또 써야하지??라는 의문이 들었따.

  1. FileOutputStream: 바이트 단위로 데이터를 파일에 씁니다. 객체를 저장할 수는 없고, 일반적으로 텍스트나 이미지 같은 바이트 데이터에 사용됩니다.
  2. ObjectOutputStream: 객체를 직렬화하여 바이트로 변환하고, 이 바이트를 FileOutputStream 같은 바이트 스트림에 기록합니다.

따라서 FileOutputStream은 바이트를 쓸 수 있지만, 객체를 파일에 저장하고 싶다면 ObjectOutputStream을 사용해야 하고, 이 두 스트림은 함께 사용될 수 있습니다.

3. 오늘의 목표

for(Member member : defaultMembers){
	oos.writeObject(member);

해당 코드 설명하기.

  1. oos는 ObjectOutputStream이고, 이 객체는 객체를 직렬화하여 바이트 형태로 파일에 저장하는 역할을 합니다.
    2. writeObject() 메서드 는 객체를 직렬화하여 파일에 저장하는 것이므로, Member 객체들을 파일로 내보내는 과정입니다.

즉, 이 코드는 defaultMembers 컬렉션에 들어있는 모든 Member 객체를 파일에 저장하는 코드입니다. 근데 어디에 저장되는가? 라면..

private final File file =
new File("src/main/com/......"); //Final클래스 이용하여 final 객체 생성

ObjectOutputStream oos = null;
oos = new ObjectOutputStream(
	  new BufferedOutputStream(
    		new FileOutputStream(file)
            )
        );

앞에서 본 이 file객체에 저장된 경로에 내보낸 객체들이 파일로 저장되는 것이다!

for (Member member: defaultMembers){
	oos.writeObject(member);
}
profile
럭키헤일리

0개의 댓글