일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 정보처리기사실기
- html/css
- 정보처리기사필기
- 자바스크립트심화
- 디버깅
- SQL
- 데이터분석
- 중학1-1
- c언어
- 자바스크립트
- 자바
- JDBC
- rnn
- JSP
- 순환신경망
- 딥러닝
- 상속
- JSP/Servlet
- 개발일기
- 컴퓨터구조
- 혼공머신
- 연습문제
- 머신러닝
- 컴퓨터비전
- 자바 실습
- 데이터베이스
- 중학수학
- CSS
- 오블완
- 파이썬
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
[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 키워드의 역할
- 메서드의 실행 결과를 호출한 곳으로 반환
- 메서드가 실행을 끝내고 결과값을 호출한 곳으로 전달할 때 사용
- 반환값의 자료형은 메서드 선언 시 지정한 반환 타입과 일치해야 함
- 메서드 실행 종료
- return 키워드를 만나면 메서드 실행이 즉시 종료된다.
예제 1 : 반환값이 있는 메서드
예제 2 : 반환값이 없는 메서드 (void 타입)
- 반환값이 없는 경우, return 키워드를 생략하거나 단독으로 사용 가능
주의사항
- 반환값이 있는 메서드는 반드시 return문을 통해 값을 반환해야 한다.
- 반환값의 자료형은 메서드 선언 시의 반환 타입과 일치해야 한다.
예를 들어, 반환 타입이 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;
}
}
정리하면
클래스의 주요 구성요소는 아래와 같다.
- 필드 (Field) : 객체의 속성을 저장
- 메서드 (Method) : 객체의 동작을 정의
- 생성자 (Constructor) : 객체 초기화를 위한 특수 메서드
- 접근 제어자 (Access Modifier) : 접근 범위를 제어
- 내부 클래스 (Nested Class) : 클래스 내에 정의된 클래스
- 정적 요소 (Static Members) : 클래스 단위로 공유되는 필드나 메서드
이 구성 요소들은 클래스 설계에서 객체의 상태와 동작을 정의하고 캡슐화를 구현하는 데 중요한 역할을 한다.
이제 이러한 클래스 구성요소를 활용해 예제를 하나 만들어보겠다.
클래스 사용 예제
Person 클래스
Main 클래스
예제 코드 분석
- 필드
- name과 age는 객체의 속성을 저장
- count는 static으로 선언되어 클래스 단위로 공유됨
- 메서드
- introduce() : 객체가 자기소개를 출력
- getCount() : 정적 메서드로, 현재까지 생성된 객체 수를 반환
- 생성자
- Person(String name, int age) : 객체 생성 시 이름과 나이를 초기화
- Getter와 Setter
- getName(), setName() : name 필드 접근 및 수정
- getAge(), setAge() : age 필드 접근 및 수정
- 정적 요소
- count와 getCount() : 객체 생성 횟수를 추적
- 내부 클래스
- Job : 특정 객체와 관련된 직업 정보를 관리
정적 필드와 정적 메서드는 언제 사용할까?
정적 필드와 메서드는 왜 사용하는지 궁금해졌다. 정적 필드(static field)와 정적 메서드(static method)는 클래스 단위로 공유되는 데이터를 저장하거나, 특정 작업을 객체 생성 없이 수행할 수 있도록 하기 위해 사용한다.
1. 정적 필드 (static field)
사용 목적
- 클래스 수준에서 데이터 공유
- 정적 필드는 모든 객체가 공유하는 필드로, 클래스 단위로 관리된다.
- 특정 값을 객체마다 따로 저장하지 않고, 공통적으로 저장하고 사용해야 할 때 유용하다.
- 메모리 절약
- 정적 필드는 클래스 로드 시 한 번만 메모리에 할당되며, 여러 객체에서 공유된다.
- 동일한 데이터를 여러 객체가 별도로 저장하지 않으므로 메모리를 절약할 수 있다.
사용 예제
설명
- count는 모든 Cat 객체가 공유하는 값이다.
- 두 개의 객체가 생성될 때마다 count 값이 증가하며, 객체끼리 공통된 데이터를 공유한다.
2. 정적 메서드 (static method)
사용 목적
- 객체와 독립적인 동작
- 정적 메서드는 객체를 생성하지 않고도 호출할 수 있다.
- 특정 작업을 수행하기 위해 객체의 상태나 필드가 필요하지 않을 때 적합하다.
- 클래스 유틸리티 기능 제공
- 정적 메서드는 주로 유틸리티 클래스에서 사용된다.
- 예를 들어, 수학 계산, 문자열 처리 등 특정 작업을 수행하는 메서드에 사용된다.
설명
- 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 메서드의 제한
- 객체 필드 접근 불가
- 정적 메서드는 객체와 독립적으로 동작하므로, 객체 필드나 객체 메서드에 직접 접근할 수 없다.
- this 키워드도 사용할 수 없다.
이러한 오류가 뜬다.
2. 객체 상태를 필요로 하는 작업에 부적합
- 정적 메서드는 입력값만으로 작업을 수행해야 하며, 객체의 상태를 필요로 하는 작업에는 적합하지 않다.
이 코드는 static 메서드인 display()에서 클래스의 인스턴스 필드(value)를 직접 접근하려고 해서 컴파일 에러가 발생하고 있다. 이는 static 메서드가 객체와 독립적으로 동작하기 때문에, 인스턴스 필드에 접근할 수 없기 때문이다.
수정하는 방법
- value를 static 필드로 변경
- value를 static으로 선언하면 static 메서드에서 직접 접근할 수 있다.
- 객체 생성 후 value를 사용
- static 메서드에서 value를 사용하려면 객체를 생성한 후, 그 객체의 인스턴스 필드에 접근해야 한다.
수정 방법 1: value를 static 필드로 변경
수정 방법 2: 객체 생성 후 value 사용
클래스를 새로 만들면 static 메서드로 선언했던 값으로 불러와지므로 그냥 이전 코드를 수정하는 방법으로 코드를 작성했다.
3. 언제 사용해야 할까?
정적 메서드를 사용하는 경우
- 객체 상태와 무관하게 동작할 때
- 공통 기능을 제공하는 유틸리티 메서드 (예: 수학 계산, 문자열 처리)
- 특정 작업이 클래스 수준에서 이루어져야 할 때
일반 메서드를 사용하는 경우
- 객체 상태(필드)를 참조하거나 수정해야 할 때
- 객체별로 동작이 달라야 할 때
정리하면
- 정적 메서드는 객체와 독립적으로 동작하며, 클래스 이름으로 호출된다. 객체 상태와 무관한 작업에 적합하다.
- 일반 메서드는 객체 상태를 활용하거나 변경할 수 있으며, 객체를 생성한 후 호출해야 한다.
- 필요한 작업이 객체 상태와 관련이 있는지 없는지에 따라 적절한 메서드 유형을 선택하면 된다.
학습을 마치고
이번에는 내가 그동안 잘 모르고 어려웠던 부분에 대해서 집중적으로 공부해보았다. return을 매번 사용하면서도 정확히 어떨 때 사용하는지 잘 몰랐다. 그리고 클래스의 구성요소도 static에 대해서도 언제 사용하는지 알지 못했다. 이번에 이 부분에 대해서 정확히 짚고 넘어갈 수 있어서 정말 좋았다.
사실 빨리 다음 문제로 건너뛰고 싶은 마음도 있었지만 이번에 공부하지 않으면 다시 복습할 기회는 많지 않을 것 같았다. 아무튼 새로운 사실을 깨닫게 되어 기쁘고 감사했다.
'개발 포트폴리오 > 수료증 및 시험' 카테고리의 다른 글
[Spring반] 중간시험 8 - Java 이론 시험 및 문제 풀이 8 : 문제 19~20번 <추상클래스와 인퍼페이스> (0) | 2024.12.08 |
---|---|
[Spring반] 중간시험 7 - Java 이론 시험 및 문제 풀이 7 : 문제 17~18번 <생성자와 오버로딩/오버라이딩> (0) | 2024.12.08 |
[Spring반] 중간시험 5 - Java 이론 시험 및 문제 풀이 5 : 문제 12~14번 <배열> (0) | 2024.12.08 |
[Spring반] 중간시험 4 - Java 이론 시험 및 문제 풀이 4 : 문제 9번 응용 ~ 11번 <반복문2> (0) | 2024.12.08 |
[Spirng반] 중간시험 3 - Java 이론 시험 및 문제 풀이 3 : 문제 9번 <반복문> (0) | 2024.12.04 |