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

클래스와 객체 17 - 단원 연습문제 이론편 문제 풀기 : 1~5번 본문

프로그래밍 언어/자바

클래스와 객체 17 - 단원 연습문제 이론편 문제 풀기 : 1~5번

huenuri 2024. 8. 19. 12:32

드디어 연습문제를 풀어볼 수 있게 되었다. 간단한 문제는 책에다 풀고 코드를 작성해야 하는 부분은 이클립스에다 풀어보려고 한다. 하지만 모든 문제에 대해 해설과 함께 설명을 써보며 내가 원하는 문제로 바꾸어서 출력해보기도 할 것이다. 지난번 3장에서 그랬듯이..

그럼 학습을 시작해보자!


 

 

 

 

연습문제 이론편 문제 풀기

 

 

1번 문제

 

자바의 클래스와 객체에 대한 설명 중 틀린 것은?

① 자바에서 클래스 바깥에 전역 변수를 선언할 수 없고 모든 변수는 클래스 안에 있어야 한다.

④ 필드는 클래스 내에서 private으로 선언하여 보호하는 것이 일반적이다.


 

 

 

2번 문제

 

생성자에 대한 설명 중 틀린 것은?

④ 생성자에서는 아무 값도 리턴하지 않기에  return 타입을 지정할 수 없다. 하지만 생성자에서 return 문을 사용할 수 없다는 뜻은 아니다. return 문은 메소드의 실행을 끝내고 호출한 곳으로 돌아가라는 명령이므로, 생성자의 실행을 끝내고자 하면 생성자 코드 내 어디서든 return 문을 사용할 수 있다.


 

 

 

3번 문제

 

다음 코드 중 오류가 있는 것은?

1) 번 문제

 

처음에는 오류가 떠서 왜 그런가 했는데 클래스 이름이 Power로 되어 있어야 했다. 그리고 배열의 각 원소를 초기화해야 이 객체를 사용할 수 있게 된다.

하지만 같은 클래스 이름을 사용하면 오류가 뜨므로 한 개씩 진행해보기로 했다.


 

 

 

2)번 문제

 

 

 

 

3)번 문제

 

여기서는 오류가 뜬다. 이건 C나 C++에서 배열을 선언하는 방시이다. 자바에서는 배열을 선언할 때 이러한 방식으로 배열의 크기를 지정할 수 없다. 배열의 크기를 지정하지 않고 배열을 선언하고, new 연산자를 사용하여 배열 객체를 생성한다.

이건 언어마다 문법이 다르기 때문에 암기해야 할 것이다. 배열할 때 많이 공부해서 이 문제는 매우 쉽게 풀었다.


 

 

 

 

4)번 문제

 

이 코드로 사용 가능하지만 뒤의 문장에서는 오류가 떠서 주석 처리해주었다. 그 이유가 무엇일까? Power[ ] p;는 power 객체를 담을 수 있는 배열 변수 p를 선언하지만, 배열을 생성하지는 않아 p는 null 상태이다. 그렇기에 배열을 사용하기 전에 배열을 초기화해야 한다. 만약 초기화하지 않으면 NullPointException이 발생한다.

이 문제는 사용은 할 수 있지만 이후 작업이 필요한 코드였다.

 

이렇게 작은 문제 하나하나 코드를 분석하며 풀어보니 시간은 많이 걸려도 확실히 이해할 수 있게 되는 것 같다. 이제 다음 문제로 넘어가보자.


 

 

 

 

문제 4번

다음 코드에 대해 설명하는 문항 중 틀린 것은?

Book[] book = new Book[10];

 

이 문제는 크기가 10인 Book 객체 배열을 선언과 동시에 생성하는 문장이다.

 

① book은 배열에 대한 레퍼런스 변수이다.

② 객체 배열은 객체의 레퍼런스를 요소에 저장하는 배열이다. 아직 Book 객체는 만들어지지 않았고, Book 객체의 레퍼런스를 저장할 크기가 10인 배열만 만들어진 상태이다.

③ 객체의 레퍼런스를 저장하는 배열에 new 연산자로 각각의 객체를 성성한 뒤 대입해야 객체 배열이 완성된다.

④ book의 인덱스 i번째 요소에는 Book 객체에 대한 레퍼런스 값이 저장되어 있다. 즉 book[0], book[1] ... book[9] 모두 Book 객체에 대한 레퍼런스이다.


 

 

 

 

문제 5번

다음 중 메소드 오버로딩에 실패한 사례는?

 

 

1)번 문제

 

void라고 썼기에 리턴 타입이 다르니 메소드 오버로딩이 당연히 되는 것로 생각했다. 하지만 전혀 아니었다.

이 문제를 이해하기 위해서는 어떤 때 오버로딩이 성립하는지 알아야 한다.

 

  1. 메소드 이름이 같아야 한다.
  2. 매개변수의 개수나 타입이 달라야 한다.
  3. 리턴 타입만으로는 오버로딩이 구별되지 않는다.

리턴 타입으로는 오버로딩을 구별할 수 없기에 안 되는 것이다.

  • Java에서는 메소드 오버로딩이 리턴 타입만으로 구별될 수 없다. 즉, 메소드의 이름과 매개변수의 리스트가 동일하다면 리턴 타입이 다르더라도 오버로딩으로 인정되지 않는다.
  • 두 메소드는 매개변수의 타입과 개수가 동일하기 때문에, 단순히 리턴 타입이 다르다고 해서 오버로딩이 성립되지 않는다.

 

 

 

 

2)번 문제


 

 

 

 

3)번 문제


 

 

 

 

4)번 문제

 

static은 안되는 줄 알았는데 이것도 가능했다. 메소드 오버로딩은 인스턴스 메소드와 static 메소드 모두에서 적용될 수 있다. 중요한 점은 메소드의 이름과 매개변수 리스트가 서로 다르면 오버로딩이 가능하다는 것이다.

다음은 static 오버로딩의 예시를 좀더 살펴보면 문제 코드를 하나 작성해보았다.


 

 

 

 

 

static 오버로딩 예시

 

 

이렇게 static도 오버로딩이 잘 되는 것을 확인할 수 있다. 


 

 

 

 

학습을 마치고

문제가 많아서 여기까지 마치고 다음 포스트에서 6번 문제부터 풀어보려고 한다. 5번 문제까지는 이론적인 내용이 많았다면 이 다음 문제부터는 코드를 수정하며 좀더 복잡한 코드들이 준비되어 있다. 

이제 아침 수업도 20분밖에 남지 않아 정말 아쉽지만 풀 수 있는데 까지 풀어봐야지!