인프런 커뮤니티 질문&답변

장동철님의 프로필 이미지

작성한 질문수

나도코딩의 자바 기본편 - 풀코스 (20시간)

인스턴스 변수

클래스 객체에 대해서 궁금한 것이 있습니다.

24.09.24 17:22 작성

·

50

·

수정됨

0

image.png

클래스 객체 사용 X

image.png

클래스 객체 사용 O

 

먼저 결론적으로 말씀드리면 제품의 정보를 일일이 정의한 것과 클래스 객체를 통해 코드를 작성한 것의 차이를 잘 모르겠습니다.

제가 챕터 7의 1번째 강의를 중에서 블랙박스의 정보는 이보다 실제로 많기 때문에 이 모든 것을 일일이 정의한다면 코드가 방대해 진다고 들었습니다. 그런데 제가 실습하고 나서 코드를 살펴보니 클래스 객체에 대한 필요성을 느끼지 못하였습니다. 알려주신다면 감사하겠습니다.

답변 2

2

나도코딩님의 프로필 이미지
나도코딩
지식공유자

2024. 09. 24. 23:24

안녕하세요?

보다 쉬운 이해를 위해 클래스를 물건을 정리하는 필통이라고 생각해 볼 수 있습니다.
필통 안에는 연필, 지우개, 자 같은 물건들이 들어있습니다. 만약 필통이 없다면, 각각의 물건을 개별적으로 주머니나 가방에 넣어 다니거나 손에 들고 다녀야 하겠죠. 그러면 매번 연필을 꺼내려 할 때마다 어디 있는지 찾아야 하고, 지우개나 자도 어디에 넣었는지 헷갈릴 것입니다. 어쩌면 물건을 잃어버릴 확률도 높아질 수 있어요.

클래스는 이 필통과 같습니다. 여러 관련된 데이터를 한 곳에 모아두는 "정리 도구"라고 할 수 있습니다. 예를 들어, 학생을 나타내는 클래스를 만든다고 생각해 볼까요? 학생은 이름, 나이, 학번 같은 정보를 가지고 있습니다. 이 정보를 개별적으로 관리하면 매우 복잡해집니다. 하지만 학생 클래스를 만들면, 이 모든 정보를 하나의 "필통"에 넣어서 정리할 수 있습니다.

class Student {
    String name;
    int age;
    String studentId;
}

인스턴스 변수는 필통 안의 물건입니다. 예를 들어, name 은 그 학생의 이름(연필), age 는 나이(지우개), studentId 는 학번(자)이라고 볼 수 있습니다. 한 학생이라는 "필통" 안에 이 모든 것을 정리해 두면, 나중에 필요할 때 쉽게 꺼내 쓸 수 있겠죠.

Student student1 = new Student();
student1.name = "나도코딩";
student1.age = 20;
student1.studentId = "20240001";

위와 같이 코드를 작성하게 되면 student1이라는 필통에 나도코딩이라는 학생의 정보가 모두 들어간 것입니다. 만약 이 학생의 나이나 이름이 필요하면, student1에서 바로 꺼내 쓸 수 있습니다.

만약 클래스를 사용하지 않고 각각의 정보를 따로 관리한다고 생각해 보면 어떨까요?

String name1 = "나도코딩";
int age1 = 20;
String studentId1 = "20240001";

이렇게 하면 학생이 두 명, 세 명 늘어날 때마다 새로운 변수를 만들고 그 변수들을 각각 개별적으로 사용해야 합니다. 이는 마치 필통 없이 여러 개의 연필, 지우개, 자를 손에 들고 다니는 것과 같아요. 특정 연필을 찾으려고 할 때마다 주머니를 뒤져야 하듯, 변수들을 하나씩 찾아야 하는 상황이 됩니다.

하지만 클래스를 사용하면 여러 학생의 정보를 각 필통(클래스 인스턴스) 안에 깔끔하게 정리할 수 있기 때문에 훨씬 효율적입니다.


뿐만 아니라, 클래스 객체를 어떤 메소드에 전달하는 경우에도 큰 이점이 있습니다. 만약 클래스를 사용하지 않고 각 데이터를 개별적인 변수로 전달한다면, 메소드의 정의는 매우 복잡해질 수 있어요. 예를 들어, 학생의 이름, 나이, 학번을 처리하는 메소드를 만든다고 가정해 보겠습니다. 클래스를 사용하지 않는다면, 이 메소드는 다음과 같이 여러 개의 매개변수(전달값)를 가져야 하겠죠.

public void processStudent(String name, int age, String studentId) {
    // 학생 처리 로직
}

하지만 만약 전달해야 할 정보가 더 많아진다면, 메소드의 매개변수가 계속 늘어나 복잡해질 수 있습니다. 경우에 따라 필요하지 않은 변수를 전달해야 하는 상황이 생기기도 하죠. 예를 들어, 학번이 필요 없는데도 불구하고 메소드에 전달해야 할 수 있습니다.

그러나 객체를 전달하면 이러한 문제는 훨씬 간단하게 해결될 수 있답니다. 객체로 모든 관련 데이터를 묶어 전달하면, 메소드 정의가 단순해지고, 필요하지 않은 인스턴스 변수는 그냥 사용하지 않으면 됩니다. 이렇게 하면 여러 데이터를 한 번에 관리하는 측면에서 매우 편리해져요. 아래와 같은 방식으로 클래스 객체를 메소드에 전달할 수 있습니다:

public void processStudent(Student student) {
    // 필요한 정보만 사용
    System.out.println(student.name);
}

이 경우에는 Student 객체를 전달받아 메소드 안에서 필요한 인스턴스 변수만 사용할 수 있습니다. 만약 나이나 학번 정보가 필요 없다면, 단순히 사용하지 않으면 그만입니다. 즉, 메소드가 불필요하게 많은 매개변수를 받을 필요가 없어지고, 데이터 관리와 처리도 훨씬 유연해지는 것이죠.


정리하자면, 지금 학습하시는 단계에서 클래스는 관련된 정보를 하나로 묶어서 관리할 수 있게 해주는 필통과 같습니다. 필통이 있으면 물건을 잃어버리지 않고 필요할 때 쉽게 꺼낼 수 있듯, 클래스도 정보를 깔끔하게 정리하고 다룰 수 있게 해주는 중요한 도구입니다. 그리고 객체를 사용하면 메소드 정의가 간결해지고, 불필요한 변수를 제거하는 과정을 고민하지 않아도 됩니다. 이는 결국 프로그램의 유지 보수성과 가독성을 높이는 데에도 큰 도움이 된다는 이점이 있답니다 🙂

감사합니다.

0

인프런 AI 인턴님의 프로필 이미지

2024. 09. 24. 17:26

안녕하세요, 인프런 AI 인턴입니다. 장동철님.

클래스와 객체의 개념에 대해서 혼란스러우신 것 같습니다. 다음은 이러한 개념을 더 잘 이해하시도록 도와드릴 기존의 답변 링크들입니다:

간단히 요약하자면:
1. 클래스 vs. 객체:
- 클래스는 하나의 청사진 혹은 틀로서 여러 개체(객체)를 만들어내기 위한 것입니다.
- 객체는 그 클래스를 기반으로 만든 실제 개체입니다. 예를 들어, BlackBox라는 클래스는 다양한 블랙박스 제품을 만들 때 사용할 수 있는 틀이고, b1, b2 등 객체는 그 틀을 이용해 만든 실제 제품입니다.
2. 재사용성:
- 클래스화시키면 코드가 반복되지 않고, 코드의 재사용성이 높아집니다. 하나의 클래스를 여러 곳에서 사용할 수 있기 때문에 유지보수가 쉬워집니다.
3. 관리 용이성:
- 정보를 일일이 정의하는 방식보다 객체를 사용하면 코드의 방대해짐을 막고, 코드 관리를 용이하게 만들 수 있습니다.
4. 확장성:
- 새로운 제품이 추가되거나 기존 제품의 속성이 변경될 경우 클래스 내에서만 코드를 수정하면 됩니다.

위 링크들을 통해 더 깊이 이해하시길 바라며, 이미지를 포함한 명확한 예제와 설명은 질문글에서 확인해 보실 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.