관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

[Spring반] 중간시험 6 - Java 이론 시험 및 문제 풀이 6 : 문제 15~16번 <메서드와 클래스, static 필드/ 메서드> 본문

개발 포트폴리오/수료증 및 시험

[Spring반] 중간시험 6 - Java 이론 시험 및 문제 풀이 6 : 문제 15~16번 <메서드와 클래스, static 필드/ 메서드>

huenuri 2024. 12. 8. 20:33

이제 클래스와 생성자에 대해 공부해 볼 것이다. 아직도 6문제나 남아있지만 차근차근 풀어보겠다.


 

 

 

Java 이론 시험 여섯 번째

 

문제 15번

메서드의 결과값을 반환하기 위해 사용하는 키워드를 작성하시오.

 

메서드의 결과값을 반환하기 위해 사용하는 키워드는 return이다.

 

return 키워드의 역할

  1. 메서드의 실행 결과를 호출한 곳으로 반환
    • 메서드가 실행을 끝내고 결과값을 호출한 곳으로 전달할 때 사용
    • 반환값의 자료형은 메서드 선언 시 지정한 반환 타입과 일치해야 함
  2. 메서드 실행 종료
    • return 키워드를 만나면 메서드 실행이 즉시 종료된다.

 

예제 1 : 반환값이 있는 메서드


 

 

 

 

예제 2 : 반환값이 없는 메서드 (void 타입)

  • 반환값이 없는 경우, return 키워드를 생략하거나 단독으로 사용 가능

 


 

 

주의사항

  1. 반환값이 있는 메서드는 반드시 return문을 통해 값을 반환해야 한다.
  2. 반환값의 자료형은 메서드 선언 시의 반환 타입과 일치해야 한다.

예를 들어, 반환 타입이 int라면 return문 뒤의 값도 반드시 int여야 한다. 반환 타입이 void라면 return에 값을 사용할 수 없다. 결론은 다음과 같다. 메서드의 결과값을 반환하기 위해 사용하는 키워드는 return이다. 반환값이 없을 때는 반환 타입을 voi로 선언하고, return을 생략하거나 단독으로 사용할 수 있다.


 

 

 

문제 16번

클래스의 구성요소 2가지를 작성하시오.

 

클래스의 구성요소는 여러 가지가 있지만, 기본적으로 필드(멤버 변수)와 메서드가 가장 중요한 두 가지 요소이다. 여기에 추가로 생성자, 접근 제어자 등도 클래스 구성에 포함될 수 있다.

 

1. 필드 (Field)

  • 클래스 내에서 정의된 멤버 변수로, 객체의 상태나 속성을 저장.
  • 클래스가 생성되면 객체와 함께 메모리에 할당되며, 값을 저장하거나 변경할 수 있음.

예제

public class Person {
    String name;  // 필드: 이름
    int age;      // 필드: 나이
}

 

 

2. 메서드 (Method)

  • 클래스의 기능이나 동작을 정의하는 코드 블록.
  • 입력값(매개변수)을 받아 처리하고, 결과값을 반환하거나 특정 작업을 수행.
  • 객체가 수행할 동작을 구현하는 데 사용됨.

예제

public class Person {
    String name;
    int age;

    void introduce() { // 메서드: 자기소개
        System.out.println("안녕하세요, 제 이름은 " + name + "입니다.");
    }
}

 

 

3. 생성자 (Constructor)

  • 객체 생성 시 호출되는 특수한 메서드.
  • 클래스 이름과 동일하며, 반환 타입이 없음.
  • 객체 초기화에 사용되며, 기본 생성자와 매개변수 생성자가 있음.

예제

public class Person {
    String name;
    int age;

    // 생성자
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

 

 

4. 접근 제어자 (Access Modifier)

  • 클래스 구성 요소(필드, 메서드, 생성자 등)의 접근 범위를 제어.
  • 주요 키워드:
    • public: 어디서든 접근 가능.
    • private: 같은 클래스 내에서만 접근 가능.
    • protected: 같은 패키지 및 상속받은 클래스에서 접근 가능.
    • (default): 같은 패키지 내에서만 접근 가능.

예제

public class Person {
    private String name;  // 외부에서 직접 접근 불가
    private int age;

    public String getName() { // getter 메서드로 접근
        return name;
    }

    public void setName(String name) { // setter 메서드로 값 설정
        this.name = name;
    }
}

 

 

5. 내부 클래스 (Nested Class)

  • 클래스 안에 정의된 또 다른 클래스.
  • 내부적으로 사용하거나 특정 기능을 캡슐화하기 위해 사용.

예제

public class MathUtil {
    static int add(int a, int b) { // 정적 메서드
        return a + b;
    }
}

 

 

6. 정적 요소 (Static Members)

  • static 키워드를 사용해 정의된 필드나 메서드.
  • 객체를 생성하지 않고도 클래스 이름을 통해 접근 가능.

예제

public class MathUtil {
    static int add(int a, int b) { // 정적 메서드
        return a + b;
    }
}

 

정리하면

클래스의 주요 구성요소는 아래와 같다.

  1. 필드 (Field) : 객체의 속성을 저장
  2. 메서드 (Method) : 객체의 동작을 정의
  3. 생성자 (Constructor) : 객체 초기화를 위한 특수 메서드
  4. 접근 제어자 (Access Modifier) : 접근 범위를 제어
  5. 내부 클래스 (Nested Class) : 클래스 내에 정의된 클래스
  6. 정적 요소 (Static Members) : 클래스 단위로 공유되는 필드나 메서드

이 구성 요소들은 클래스 설계에서 객체의 상태와 동작을 정의하고 캡슐화를 구현하는 데 중요한 역할을 한다.

 

 

이제 이러한 클래스 구성요소를 활용해 예제를 하나 만들어보겠다.


 

 

클래스 사용 예제

 

Person 클래스


 

 

Main 클래스

 


 

 

예제 코드 분석

  1. 필드
    • name과 age는 객체의 속성을 저장
    • count는 static으로 선언되어 클래스 단위로 공유됨
  2. 메서드
    • introduce() : 객체가 자기소개를 출력
    • getCount() : 정적 메서드로, 현재까지 생성된 객체 수를 반환
  3. 생성자
    • Person(String name, int age) : 객체 생성 시 이름과 나이를 초기화
  4. Getter와 Setter
    • getName(), setName() : name 필드 접근 및 수정
    • getAge(), setAge() : age 필드 접근 및 수정
  5. 정적 요소
    • count와 getCount() : 객체 생성 횟수를 추적
  6. 내부 클래스
    • Job : 특정 객체와 관련된 직업 정보를 관리

 

 

 

정적 필드와 정적 메서드는 언제 사용할까?

정적 필드와 메서드는 왜 사용하는지 궁금해졌다. 정적 필드(static field)와 정적 메서드(static method)는 클래스 단위로 공유되는 데이터를 저장하거나, 특정 작업을 객체 생성 없이 수행할 수 있도록 하기 위해 사용한다.

 

1. 정적 필드 (static field)

사용 목적

  1. 클래스 수준에서 데이터 공유
    • 정적 필드는 모든 객체가 공유하는 필드로, 클래스 단위로 관리된다.
    • 특정 값을 객체마다 따로 저장하지 않고, 공통적으로 저장하고 사용해야 할 때 유용하다.
  2. 메모리 절약
    • 정적 필드는 클래스 로드 시 한 번만 메모리에 할당되며, 여러 객체에서 공유된다.
    • 동일한 데이터를 여러 객체가 별도로 저장하지 않으므로 메모리를 절약할 수 있다.

 

사용 예제

 

 

 

설명

  • count는 모든 Cat 객체가 공유하는 값이다.
  • 두 개의 객체가 생성될 때마다 count 값이 증가하며, 객체끼리 공통된 데이터를 공유한다.

 

 

2. 정적 메서드 (static method)

사용 목적

  1. 객체와 독립적인 동작
    • 정적 메서드는 객체를 생성하지 않고도 호출할 수 있다.
    • 특정 작업을 수행하기 위해 객체의 상태나 필드가 필요하지 않을 때 적합하다.
  2. 클래스 유틸리티 기능 제공
    • 정적 메서드는 주로 유틸리티 클래스에서 사용된다.
    • 예를 들어, 수학 계산, 문자열 처리 등 특정 작업을 수행하는 메서드에 사용된다.

 

 

 

설명

  • MathUtil.add()는 객체 상태와 무관하며, 단순히 두 숫자의 합을 계산한다.
  • 객체를 생성하지 않고도 사용할 수 있어 편리하다.

 

정적 필드와 정적 메서드의 특징

특징 정적 필드 (static field) 정적 메서드 (static method)
클래스 단위로 관리 모든 객체가 공유 클래스 자체에서 호출 가능
객체 생성 여부 객체 생성과 상관없이 접근 가능 객체 없이 호출 가능
주요 용도 공통 데이터 저장 공통 동작 수행
접근 방식 클래스명.필드명 클래스명.메서드명()
객체 필드 접근 여부 객체 필드에 접근 불가 객체 필드 및 this 키워드 사용 불가

 

 

정리하면

  • 정적 필드는 모든 객체가 공유해야 하는 공통 데이터를 저장할 때 사용
  • 정적 메서드는 객체 상태와 무관한 공통 작업을 수행하거나 유틸리티 기능을 제공할 때 사용
  • 객체의 상태와 관련이 없는 클래스 수준의 기능을 구현하려면 정적 필드와 정적 메서드를 활용하면 돼

이런 특징들을 통해 클래스 수준의 데이터와 동작을 효율적으로 관리할 수 있다.


 

 

static 메서드와 일반 메서드의 차이점

static 메서드와 일반 메서드의 차이에 대해서 궁금해졌다. static 메서드는 일반 메서드와 다르며, 몇 가지 중요한 차이점이 있다.

 

1. static 메서드와 일반 메서드의 차이

구분 정적 메서드 (static method) 일반 메서드 (instance method)
호출 방식 클래스 이름을 통해 호출 가능 객체를 생성한 후 호출 가능
객체 의존성 객체와 독립적으로 동작, 객체 상태와 무관 객체 상태를 활용하거나 변경 가능
this 키워드 사용 사용 불가능 this를 사용해 객체 참조 가능
주요 용도 공통 기능, 유틸리티 작업 등 객체 상태와 무관한 작업 수행 객체 상태와 관련된 작업 수행
메모리 클래스 로드 시 한 번만 메모리에 할당 객체 생성 시 메모리에 따로 할당

 

일반 메서드 (instance method) : 정적 메서드가 있을 때

 

 

 

같은 패키지에 클래스 이름을 다르게 만들어도 정적 메서드가 있을 경우 정적 메서드의 값이 출력된다. 새로운 패키지에 일반 메서드 클래스를 만들어보았다.


 

 

 

일반 메서드 (instance method) : 정적 메서드가 있을 때

 

 

 

설명

  • introduce 메서드는 객체의 name 필드 값을 참조해 동작한다.
  • 객체 상태(name)가 필요하기 때문에 일반 메서드로 정의되었다.

 

새로운 패키지에 만들자 이제 제대로 출력이 되고 있다. 이렇게 정적 메서드와 일반 메서드는 차이가 있었다.


 

 

 

2. static 메서드의 제한

  1. 객체 필드 접근 불가
    • 정적 메서드는 객체와 독립적으로 동작하므로, 객체 필드나 객체 메서드에 직접 접근할 수 없다.
    • this 키워드도 사용할 수 없다.

 

 

 

이러한 오류가 뜬다.

 

2. 객체 상태를 필요로 하는 작업에 부적합

  • 정적 메서드는 입력값만으로 작업을 수행해야 하며, 객체의 상태를 필요로 하는 작업에는 적합하지 않다.

 

이 코드는  static 메서드인 display()에서 클래스의 인스턴스 필드(value)를 직접 접근하려고 해서 컴파일 에러가 발생하고 있다. 이는 static 메서드가 객체와 독립적으로 동작하기 때문에, 인스턴스 필드에 접근할 수 없기 때문이다.

 

수정하는 방법

  1. value를 static 필드로 변경
    • value를 static으로 선언하면 static 메서드에서 직접 접근할 수 있다.
  2. 객체 생성 후 value를 사용
    • static 메서드에서 value를 사용하려면 객체를 생성한 후, 그 객체의 인스턴스 필드에 접근해야 한다.

 

수정 방법 1: value를 static 필드로 변경

 


 

 

수정 방법 2: 객체 생성 후 value 사용

클래스를 새로 만들면 static 메서드로 선언했던 값으로 불러와지므로 그냥 이전 코드를 수정하는 방법으로 코드를 작성했다.


 

 

 

3. 언제 사용해야 할까?

정적 메서드를 사용하는 경우

  • 객체 상태와 무관하게 동작할 때
  • 공통 기능을 제공하는 유틸리티 메서드 (예: 수학 계산, 문자열 처리)
  • 특정 작업이 클래스 수준에서 이루어져야 할 때

일반 메서드를 사용하는 경우

  • 객체 상태(필드)를 참조하거나 수정해야 할 때
  • 객체별로 동작이 달라야 할 때

 

정리하면

  • 정적 메서드는 객체와 독립적으로 동작하며, 클래스 이름으로 호출된다. 객체 상태와 무관한 작업에 적합하다.
  • 일반 메서드는 객체 상태를 활용하거나 변경할 수 있으며, 객체를 생성한 후 호출해야 한다.
  • 필요한 작업이 객체 상태와 관련이 있는지 없는지에 따라 적절한 메서드 유형을 선택하면 된다.

 

 

 

학습을 마치고

이번에는 내가 그동안 잘 모르고 어려웠던 부분에 대해서 집중적으로 공부해보았다. return을 매번 사용하면서도 정확히 어떨 때 사용하는지 잘 몰랐다. 그리고 클래스의 구성요소도 static에 대해서도 언제 사용하는지 알지 못했다. 이번에 이 부분에 대해서 정확히 짚고 넘어갈 수 있어서 정말 좋았다.

사실 빨리 다음 문제로 건너뛰고 싶은 마음도 있었지만 이번에 공부하지 않으면 다시 복습할 기회는 많지 않을 것 같았다. 아무튼 새로운 사실을 깨닫게 되어 기쁘고 감사했다.