▶문제1
다음과 같은 멤버변수를 갖는 SutdaCard클래스를 정의하시오.
[답]
1
2
3
4
5
6
7
|
public class StudaCard{
int num ;
boolean isKwang;
}
|
cs |
[해설]
Class의 기본 설정 방식은 아래 내용과 같다.

여기에선 메서드는 말하지 않았으니 메서드는 제외하고 멤버변수만 설정해준다.
멤버변수(=전역변수)는 클래스 안에서 선언된 변수로서, 클래스 블록 범위 안에서 유효한 변수이다.
▶문제2
문제 1에서 정의한 SutdaCard클래스에 두 개의 생성자와 info()를 추가해서 실행결과와 같은 결과를 얻도록 하시오.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class Exercise6_2 {
public static void main(String args[]) {
a) SutdaCard card1 = new SutdaCard(3, false);
b) SutdaCard card2 = new SutdaCard();
System.out.println(card1.info());
System.out.println(card2.info());
}
}
class SutdaCard {
/* (1) 알맞은 코드를 넣어 완성하시오 . */
}
실행결과 :
3
1K
|
cs |
[답]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
int num;
boolean isKwang;
SutdaCard(int num, boolean isKwang) {
this.num = num;
this.isKwang = isKwang;
}
SutdaCard(){
this.num = 1;
this.isKwang = true;
}
String info() {
return num + (isKwang? "K" : "");
}
|
cs |
[해설]
먼저 a,b를 살펴보면 "선언과 할당의 통합으로 한 객체"의 방법으로 생성한 생성자로 메게변수에 3,false를 값으로 받는다. b는 매개변수가 없는 기본생성자이다. 생성자를 2개 생성을 해주면 클래스필드에도 역시 값을 받는(값이 없어도) 생성자를 2개 생성을 해주어야한다.
이 내용을 바탕으로 문제를 풀어보자.
첫번째 생성자는 num과 isKwang의 값을 받았음으로 이 값을 전역변수로 만들어서 메게변수에 값을 초기화시켜준다. 이 작업을 this를 사용하여 실행한다. 두번째 생성자는 첫번째 생성자로 1과 true의 값을 담아줬는데 이는 뒤의 info()에서 재설정해준다. info()메서드는 card의 정보를 문자열로 반환하기 위함인데 isKwang의 값이 true인 경우에 숫자 뒤에 "K"를 붙이도록 삼항연산자를 사용하고 변수 num은 int이지만 문자열과 덧셈 연산을 하기대문에 최종적으로는 문자열을 반환하게 된다.
▶문제3
다음과 같은 멤버변수를 갖는 Student클래스를 정의하시오.
[답]
1
2
3
4
5
6
7
8
9
10
|
class Member{
String name;
int ban;
int no;
int kor;
int eng;
int math;
}
|
cs |
▶문제4
문제3에서 정의한 Student클래스에 다음과 같이 정의된 두 개의 메서드 getTotal()과 getAverage()를 추가하시오.
① 메서드명 : getTotal
기 능 : 국어(kor), 영어(eng), 수학(math)의 점수를 모두 더해서 반환한다.
반환타입 : int
매개변수 : 없음
② 메서드명 : getAverage
기 능 : 총점(국어점수+영어점수+수학점수)을 과목수로 나눈 평균을 구한다.
소수점 둘째자리에서 반올림할 것.
반환타입 : float
매개변수 : 없음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class Exercise6_4 {
public static void main(String args[]) {
Student s = new Student();
s.name = "홍길동";
s.ban = 1;
s.no = 1;
s.kor = 100;
s.eng = 60;
s.math = 76;
System.out.println("이름:"+s.name);
System.out.println("총점:"+s.getTotal());
System.out.println("평균:"+s.getAverage());
}
}
class Student {
/*
(1) 알맞은 코드를 넣어 완성하시오.
*/
}
|
cs |
[답]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class Student {
String name;
int ban;
int no;
int kor;
int eng;
int math;
int getTotal() {
return kor + eng + math;
}
float getAverage() {
return avg = Math.round(getTotal() / 3f*100) / 100f;
}
}
}
|
cs |
총합: 236
평균: 78.7
▶문제5
다음과 같은 실행결과를 얻도록 Student클래스에 생성자와 info()를 추가하시오.
실행결과: 홍길동,1,1,100,60,76,236,78.7
1
2
3
4
5
6
7
8
9
10
11
|
class Exercise6_5 {
public static void main(String args[]) {
Student s = new Student("홍길동",1,1,100,60,76);
System.out.println(s.info());
}
}
class Student {
/*
(1) 알맞은 코드를 넣어 완성하시오.
*/
}
|
cs |
[답]
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
|
String name;
int ban;
int no;
int kor;
int eng;
int math;
Student(){} Student(String name, int ban, int no, int kor, int eng, int math) { this.name = name;
this.ban = ban;
this.no = no;
this.kor = kor;
this.eng = eng;
this.math = math;
}
int getTotal() {
return kor+eng+math;
}
float getAverage() {
return (int)(getTotal() / 3f * 10 + 0.5f) / 10f;
}
public String info() {
return name
+","+ban
+","+no
+","+kor
+","+eng
+","+math
+","+getTotal()
+","+getAverage()
;
}
|
cs |
[풀이]
info()라는 return 메서드에서 매개변수에 담겨있는 데이터값을 받으려면 해당 변수가 전역변수여야한다. 그래서 파라미터를 가지는 생성자를 클래스필드에 선언하여 해당값들을 전역변수로 만들어주고 info에서 받게한다. 이 때, Student(){} 기본생성자도 추가로 설정을 해줘야한다. java에선 기본생성자는 개발자가 따로 설정하지않아도 기본적으로 만들어주지만 파라미터를 받는 생성자가 선언되면 만들어주지않는다. 그럼 기본생성자를 클래스필드에 직접 생성해줘야한다.
▶문제6
두 점의 거리를 계산하는 getDistance()를 완성하시오.
[Hint] 제곱근 계산은 Math.sqrt(double a)를 사용하면 된다.
1
2
3
4
5
6
7
8
9
10
11
|
class Exercise6_6 {
// 두 점 (x,y)와 (x1,y1)간의 거리를 구한다.
static double getDistance(int x, int y, int x1, int y1) {
/*
(1) 알맞은 코드를 넣어 완성하시오.
*/
}
public static void main(String args[]) {
System.out.println(getDistance(1,1,2,2));
}
}
|
cs |
[답]
return Math.sqrt((x-x1)*(x-x1) + (y-y1)*(y-y1));
[해설]
두 점 (x,y)와 (x1,y1)을 구하는 공식은

이다. 실행결과는 1.4142135623730951가 나온다. 제곱근 계산은 Math.sqrt(double a)를 사용하면 수월하다. Math.pow(double a, double b)를 사용해도 되지만, 2제곱이므로 그냥 곱셈연산자를 사용했다. 어느쪽을 사용해도 괜찮지만, 메서드를 호출하는 것은 곱셈 연산보다 비용이 많이 드는 작업임을 기억해두고 빠른코드를 만들겠다고 코드를 복잡하게 하는 것은 좋지 않다.참고로 Math.pow(double a, double b)를 사용한 공식은 아래와 같다.
static double getDistance(int x, int y, int x1, int y1) {
return Math.sqrt(Math.pow(x-x1,2) + Math.pow(y-y1,2));
}
▶문제7
문제6에서 작성한 클래스메서드 getDistance()를 MyPoint클래스의 인스턴스 메서드로 정의하시오.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class Mypoint{
int x;
int y;
MyPoint(int x, int y) {
this.x = x;
this.y = y;
}
/*
(1) 인스턴스메서드 getDistance를 작성하시오.
*/
}
class Exercise6_7 {
public static void main(String args[]) {
MyPoint p = new MyPoint(1,1);
// p와 (2,2)의 거리를 구한다.
System.out.println(p.getDistance(2,2));
}
}
|
cs |
[답]
double getDistance(int x1, int y1) { return Math.sqrt((x-x1)*(x-x1) + (y-y1)*(y-y1)); }
[풀이]
Static 메서드를 인스턴스 메서드로 변경하는 문제로 Static메서드와 인스턴스 메서드의 차이를 알아야한다.
6번문제의 답 static 메서드인 경우에는 메서드 내에서 인스턴스 변수를 사용하지 않는다. 대신 매개변수(지역변수)로 작업에 필요한 값을 제공받는다. 그래서 인스턴스와 관계가 없음으로(인스턴스 변수를 사용하지 않았으니까)static 메서드로 선언을 할 수 있는 것이다.
그러나 인스턴스 메서드는 인스턴스변수 x와 y를사용하여 작업하므로 매개변수로 x1과 y1만을 제공받으면 된다. 인스턴스와 관계가 있음으로(인스턴스변수를 사용했음으로) static을 사용할 수 없다.
참고)
▶문제8
다음의 코드에 정의된 변수들을 종류별로 구분해서 적으시오.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class PlayingCard {
int kind;
int num;
static int width;
static int height;
PlayingCard(int k, int n) {
kind = k;
num = n;
}
public static void main(String args[]) {
PlayingCard card = new PlayingCard(1,1);
}
}
|
cs |
[답]
인스턴스변수: kind, num
클래스(Static) 변수: width, height
지역변수: k,n,card,args
[풀이]
변수가 선언된 위치를 보면 변수의 종류를 알 수 있다.
클래스 블럭{}내에 선언된 변수는 인스턴스 변수이고, static이 붙은 것은 static변수(클래스 변수)이며 나머지는 모두 지역변수이다.
▶문제9
-. String형의 학과와 정수형의 학번을 필드로 선언
-. Student 클래스의 main() 메소드에서 Student 객체를 생성
-. 구현한 Student 클래스를 다음을 만족하도록 기능을 추가
-> 필드를 모두 private로 하고, getter와 setter를 구현
-> Student 클래스의 main() 메소드에서 Student 객체를 생성하여 setter를 사용하여 학과와 학번 필드에 적당한 값을 입력 후 출력
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
32
33
34
35
36
37
38
|
class Student{
private String major;
private int num;
public String getMajor() {
return this.major;
}
public void setMajor(String major) {
this.major = major;
}
public int getNum() {
return this.num;
}
public void setNum(int num) {
this.num = num;
}
void print(){
System.out.println(getMajor());
System.out.println(getNum());
}
}
public class Class{
public static void main(String[] args) {
Student s = new Student();
s.setMajor("아랍어학과");
s.setNum(20211042);
s.print();
}
}
|
cs |
-. return this.major + "아랍어학과", return this.num + 20211042 로 입력을 해도 데이터값 인스턴스변수에 대입 가능
▶문제10
-. 이름, 주소, 전화번호를 필드로 가지는 Person 클래스를 설정하라
-. 하나 이상의 생성자를 정의하고 각 필드에 대하여 접근자와 설정자 메소드를 작성해라
-. Person을 상속받고 고객번호와 마일리지를 필드로 가지는 Customer 클래스를 작성하라
-. 한 개 이상의 생성자를 작성하고 적절한 접근자 메소드와 설정자 메소드를 작성하라
-. 이들 클래스들의 객체를 만들고 각 객체의 모든 정보를 출력하는 테스트 클래스를 작성하라.
[답&풀이]
[person클래스]
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
32
33
34
|
public class person{
String name;
String address;
String phonenum;
person(){}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return this.address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhonenum() {
return this.phonenum;
}
public void setPhonenum(String phonenum) {
this.phonenum = phonenum;
}
}
|
cs |
[Customer 클래스]
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
32
33
34
35
36
37
38
39
|
class Customer extends person{
int Customernum;
int mileage;
Customer(){}
public Customer(String name, String address, String phonenum, int Customernum, int mileage){
super.name = name ;
super.address = address;
super.phonenum = phonenum;
this.Customernum = Customernum;
this.mileage = mileage;
}
public int getCustomernum() {
return this.Customernum;
}
public void setCustomernum(int Customernum) {
this.Customernum = Customernum;
}
public int getMileage() {
return this.mileage;
}
public void setMileage(int mileage) {
this.mileage = mileage;
}
public String toString(){
return "이름 : " + getName()
+ ", 주소 : " + getAddress()
+ ", 휴대번호 :" + getPhonenum()
+ ", 고객번호 :" + getCustomernum()
+ ", 마일리지 :" + getMileage();
}
}
|
cs |
[Test 클래스]
1
2
3
4
5
6
7
8
9
|
public class Test{
public static void main(String[] args) {
Customer c = new Customer("홍길동","서울","010-3949-9292",123,45);
System.out.println(c.toString());
}
}
|
cs |
'오답노트 > Java' 카테고리의 다른 글
자바(java)_객체배열 연습문제 (0) | 2022.04.12 |
---|---|
자바(Java)_클래스 연습문제(2) (0) | 2022.03.23 |
클래스 상속 실습문제(1) (0) | 2022.03.20 |
클래스 상속 연습문제(1) (0) | 2022.03.19 |
조건문 연습문제 (0) | 2022.03.17 |