"안녕하세요, 아미고! 오늘 우리는 또 다른 흥미로운 주제에 대해 배울 것입니다. 특히 객체 저장 및 로드 (재구성) . Cat 클래스가 있다고 가정합니다."

암호
class Cat
{
 public String name;
 public int age;
 public int weight;
}

그리고 파일에 저장하고 불러오는 편리한 메커니즘을 추가하고 싶다고 가정해 보겠습니다.

다음과 같이 할 수 있습니다.

암호
class Cat {
    public String name;
    public int age;
    public int weight;

    public void save(PrintWriter writer) throws Exception {
        writer.println(name);
        writer.println(age);
        writer.println(weight);
        writer.flush();
    }

    public void load(BufferedReader reader) throws Exception {
        name = reader.readLine();
        age = Integer.parseInt(reader.readLine());
        weight = Integer.parseInt(reader.readLine());
    }
}

"와우! 정말 쉽네요! 각 인수의 값을 한 줄에 하나씩 쓰기만 하면 됩니다. 파일을 로드할 때 동일한 순서로 읽습니다. 완벽한 솔루션입니다."

"고맙습니다, Amigo. 이제 이 클래스 그룹에 대한 저장 및 로드 방법을 작성할 수 있습니다."

암호
class Cat
{
 public String name;
 public int age;
 public int weight;
}
class Dog
{
 public String name;
 public int age;
}
class Human
{
 public Cat cat;
 public Dog dog;
}

개 한 마리와 고양이 한 마리를 가질 수 있는 Human 개체가 있습니다.

"해결책이 있습니다."

암호
class Cat {
    public String name;
    public int age;
    public int weight;

    public void save(PrintWriter writer) throws Exception {
        writer.println(name);
        writer.println(age);
        writer.println(weight);
        writer.flush();
    }

    public void load(BufferedReader reader) throws Exception {
        name = reader.readLine();
        age = Integer.parseInt(reader.readLine());
        weight = Integer.parseInt(reader.readLine());
    }
}
암호
class Dog {
    public String name;
    public int age;

    public void save(PrintWriter writer) throws Exception {
        writer.println(name);
        writer.println(age);
        writer.flush();
    }

    public void load(BufferedReader reader) throws Exception {
        name = reader.readLine();
        age = Integer.parseInt(reader.readLine());
    }
}
암호
public class Human {
    public Cat cat;
    public Dog dog;

    public void save(PrintWriter writer) throws Exception {
        cat.save(writer);
        dog.save(writer);
    }

    public void load(BufferedReader reader) throws Exception {
        cat.load(reader);
        dog.load(reader);
    }
}

"아주 좋은 해결책이군요. 그런데 인간에게 개는 있는데 고양이가 없다면 어떻게 될까요?"

null 검사는 어디에 있습니까?

"지금 해결하겠습니다."

암호
public class Human {
    public Cat cat;
    public Dog dog;

    public void save(PrintWriter writer) throws Exception {
        if (cat != null)
            cat.save(writer);
        if (dog != null)
            dog.save(writer);
    }

    public void load(BufferedReader reader) throws Exception {
        cat = new Cat();
        cat.load(reader);
        dog = new Dog();
        dog.load(reader);
    }
}

"여전히 정확하지 않습니다. 두 가지 오류가 있습니다."

1) 사람에게 고양이나 개가 없을 수도 있지만 load 메서드가 호출되면 고양이나 개가 생성됩니다.

2) 개만 저장하면 로드될 때 고양이가 데이터를 읽습니다.

"그럼 어떻게 해야 할까요?"

" 변수 쓰기를 건너뛸 수 없습니다. 그렇지 않으면 읽는 동안 문제가 발생합니다 . 저장 작업 중에 null인 변수가 로드 작업 중에 null로 설정되었는지 확인해야 합니다. 내 버전은 다음과 같습니다."

암호
public class Human {
    public Cat cat;
    public Dog dog;

    public void save(PrintWriter writer) throws Exception {
        String isCatPresent = cat != null ? "yes" : "no";
        writer.println(isCatPresent);
        writer.flush();

        if (cat != null)
            cat.save(writer);

        String isDogPresent = dog != null ? "yes" : "no";
        writer.println(isDogPresent);
        writer.flush();

        if (dog != null)
            dog.save(writer);
    }

    public void load(BufferedReader reader) throws Exception {

        String isCatPresent = reader.readLine();
        if (isCatPresent.equals("yes")) {
            cat = new Cat();
            cat.load(reader);
        }

        String isDogPresent = reader.readLine();
        if (isDogPresent.equals("yes")) {
            dog = new Dog();
            dog.load(reader);
        }
    }
}

"예, 이 솔루션이 마음에 듭니다."

"네, 좋네요."