JavaRush /Java Blog /Random-KO /커피 브레이크 #124. 빌더 디자인 패턴입니다. Java에서 직렬화 및 역직렬화가 작동하는 방식

커피 브레이크 #124. 빌더 디자인 패턴입니다. Java에서 직렬화 및 역직렬화가 작동하는 방식

Random-KO 그룹에 게시되었습니다

Java의 빌더 디자인 패턴

출처: Medium 이 기사에서는 Builder 디자인 패턴 을 사용하여 클래스의 객체를 디자인하고 생성하는 방법을 알아봅니다 . 커피 브레이크 #124.  빌더 디자인 패턴입니다.  Java에서 직렬화 및 역직렬화가 작동하는 방식 - 1

Builder 디자인 패턴이 필요한 이유는 무엇입니까?

빌더 패턴은 외부 클래스와 동일한 데이터 필드를 갖는 중첩된 공용 정적 클래스를 사용하여 객체를 생성하도록 설계되었습니다. Builder 패턴은 클래스 객체에 많은 필드 값 및/또는 데이터가 포함될 때 FactoryAbstract Factory 디자인 패턴 에 존재하는 문제를 해결하기 위해 만들어졌습니다 . Builder 패턴 으로 넘어가기 전에 객체에 많은 필드 값이 있는 시나리오에 대해 FactoryAbstract Factory 패턴 에서 발생하는 문제를 정확히 살펴보겠습니다 .
  1. 클라이언트 프로그램에서 Factory 클래스로 전달할 인수가 너무 많으면 대부분의 경우 인수 유형이 동일하고 클라이언트 측에서 인수 순서를 유지하기 어렵기 때문에 오류가 발생할 수 있습니다.

  2. 일부 매개변수는 선택적일 수 있지만 Factory 패턴에서는 모든 매개변수를 강제로 전송해야 하며 선택적 매개변수는 NULL 파일로 전송되어야 합니다 .

  3. 객체가 "무거우며" 디자인이 복잡한 경우 이러한 모든 어려움은 Factory 클래스의 일부가 되어 종종 혼란을 초래합니다.

위의 문제는 객체에 많은 수의 매개변수가 있을 때 해결될 수 있습니다. 이렇게 하려면 생성자에 필수 매개변수를 제공한 다음, 선택적 매개변수를 설정하기 위한 다양한 setter 메소드를 제공하면 됩니다. 이 방법의 문제점은 모든 속성이 명확하게 설정되지 않으면 객체의 상태가 일관되지 않은 상태 로 유지된다는 것입니다 .

빌더 디자인 패턴이란 무엇입니까?

빌더 패턴은 객체를 단계별로 빌드하는 방법을 제공함으로써 선택적인 매개변수가 많고 상태가 일관되지 않는 문제를 해결합니다. 이는 실제로 최종 객체를 반환하는 메서드를 사용합니다.

Java에서 Builder 디자인 패턴을 구현하는 방법은 무엇입니까?

아래 단계를 따르면 객체를 생성하고 검색하는 단계별 프로세스를 얻을 수 있습니다.
  1. Builder 클래스 정적 중첩 클래스를 만든 다음 외부 클래스의 모든 필드를 Builder 클래스 복사합니다 . 명명 규칙을 따라야 하므로 클래스 이름이 Person 이면 Builder 클래스를 PersonBuilder 라고 불러야 합니다 .

  2. Builder 클래스에는 모든 필수 필드를 매개변수로 포함하는 공개 생성자가 있어야 합니다.

  3. Builder 클래스에는 선택적 매개변수를 설정하는 메소드가 있어야 하며, 선택적 필드를 설정한 후 동일한 Builder 객체를 반환해야 합니다 .

  4. 마지막 단계는 클라이언트 프로그램에 필요한 개체를 반환하는 Builder 클래스 에 build() 메서드를 제공하는 것입니다. 이렇게 하려면 기본 클래스에 Builder 클래스를 인수로 사용하는 전용 생성자가 있어야 합니다 .

예:

Builder 디자인 패턴 을 명확하게 이해하기 위해 예를 살펴보겠습니다 .
public class Employee {

    private String name;
    private String company;
    private boolean hasCar;//optional
    private boolean hasBike;//optional

    private Employee(EmployeeBuilder employeeBuilder) {
        name = employeeBuilder.name;
        company = employeeBuilder.company;
        hasCar = employeeBuilder.hasCar;
        hasBike = employeeBuilder.hasBike;
    }

    public String getName() {
        return name;
    }

    public String getCompany() {
        return company;
    }

    public boolean isHasCar() {
        return hasCar;
    }

    public boolean isHasBike() {
        return hasBike;
    }

    public static class EmployeeBuilder {
        private String name;
        private String company;
        private boolean hasCar;//optional
        private boolean hasBike;//optional

        //constructor for required fields
        public EmployeeBuilder(String name, String company) {
            this.name = name;
            this.company = company;
        }

        //setter methods for optional fields
        public EmployeeBuilder setHasCar(boolean hasCar) {
            this.hasCar = hasCar;
            return this;
        }

        public EmployeeBuilder setHasBike(boolean hasBike) {
            this.hasBike = hasBike;
            return this;
        }

        //Build the Employee object
        public Employee build() {
            return new Employee(this);
        }
    }
}

class TestBuilder {
    public static void main(String[] args) {
        //Building the object of Employee thru the build() method provided in EmployeeBuilder class.
        Employee employee = new Employee.EmployeeBuilder("Vikram", "ABC").setHasBike(false).setHasBike(true).build();
    }
}
예제 빌더 패턴 : java.lang.StringBuilderjava.lang.StringBuffer는 빌더 패턴을 사용하여 객체를 빌드했습니다.

Java에서 직렬화 및 역직렬화가 작동하는 방식

출처 : Medium 저는 인턴십을 마치고 올해 1월에 Java로 전환했습니다. 그 전에는 주로 PHP와 약간의 JavaScript로 작성했습니다. 직렬화는 실제로 PHP에 존재하지만 이전에는 직렬화를 접한 적이 없습니다. 사실, Java에서는 훨씬 더 자주 사용됩니다. 오늘은 Java에서 직렬화 및 역직렬화가 작동하는 방식과 이를 사용하는 여러 가지 방법을 소개하겠습니다.

직렬화 및 역직렬화란 무엇입니까?

직렬화는 다른 Java Virtual Machine으로 전송하기 위해 클래스의 객체를 JVM(Java Virtual Machine)의 바이트 시퀀스로 변환하는 것입니다. Java Virtual Machine이 바이트에서 객체를 다시 만드는 경우 이 프로세스를 역직렬화라고 합니다.

직렬화 및 역직렬화의 예

직렬화

객체가 직렬화될 클래스를 만들어 보겠습니다.
import java.io.*;

public class Person implements Serializable{

int id = 0;
String name = "empty";

public Person(int identity, String nomenclature) {

name = nomenclature;
id = identity;
}
}
Person 클래스는 해당 객체를 직렬화/역직렬화할 수 있도록 Serialized를 구현합니다 . Person 클래스에는 클래스 인스턴스가 생성될 때 기본값에서 변경되는 식별자와 이름이라는 두 개의 필드가 있습니다. 프로그램에 사용된 직렬화 가능 인터페이스 및 기타 클래스를 Java.io 패키지 로 가져왔습니다 .
public static void main(String[] args) throws FileNotFoundException, IOException {

String filename = "filename here";
Person person = new Person(1, "John");

// serialization
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename));

try {

out.writeObject(person);
System.out.println("Success");
} catch(Exception e) {

System.out.println("Unsuccessful");
} finally {

if(out != null) {

out.close();
}
}
}
아시다시피 기본 메소드는 직렬화를 시작하고 성공 메시지를 인쇄합니다. 그렇지 않으면 오류 메시지가 인쇄됩니다. 객체를 직렬화하기 위해 ObjectOutputStreamwriteObject 메소드를 사용합니다 .

역직렬화

public static void main(String[] args) throws FileNotFoundException, IOException {

String filename = "filename here";
Person person = new Person(1, "John");

// Deserialization
ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename));

try {

Person personObj = (Person)in.readObject();
System.out.println("Person Id is " +personObj.id + " while name is " + personObj.name);
} catch (Exception e) {

e.printStackTrace();
} finally {

if(in != null) {

in.close();
}
}
}
역직렬화는 직렬화의 반대입니다. 일련의 바이트에서 객체를 재구성하려면 ObjectInputStreamreadObject 메소드를 사용하십시오 . Person 클래스 의 필드에 대한 액세스를 제공하기 위해 객체는 Person 데이터 유형 으로 캐스팅됩니다 . 직렬화 인터페이스를 구현하지 않는 클래스 개체는 직렬화할 수 없습니다. 따라서 직렬화 인터페이스를 구현하는 클래스를 참조하는 모든 클래스는 자체적으로 직렬화 인터페이스를 구현해야 합니다. 그렇지 않으면 예외가 발생합니다. 직렬화는 플랫폼 독립적입니다. 즉, 직렬화되는 바이트 스트림이 다른 Java Virtual Machine에 의해 역직렬화될 수 있음을 의미합니다. 정적 및 임시 필드는 직렬화할 수 없으므로 직렬화하지 않으려는 필드가 있는 경우 임시 또는 정적으로 만듭니다. 정적 필드의 경우 정적 필드가 개체가 아닌 클래스에 속하므로 직렬화되지 않습니다. 이로 인해 전환 상태로 인해 필드가 직렬화되지 않습니다. 직렬화는 Hibernate, JPA 및 RMI에서 사용됩니다. 직렬화를 사용자 정의할 수도 있습니다. 이를 사용자 정의 직렬화라고 합니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION