Back-End/JAVA

[JAVA] 자바의 정석(기초편) 공부 - CHAPTER 6 . 객체지향 프로그래밍 I - 연습문제

남건욱 2023. 6. 2. 20:43
반응형

6-1 문제

자료형에 맞춰서 선언만 해주면 되는 간단한 문제이다.

 

class Student{
	String name;
    int ban;
    int no;
    int kor;
    int eng;
    int math;
}

정답코드이다.

 

 

 

 

 

 

 

 

 

6-2 문제

class Exercise6_2 {
public static void main(String args[]) {
Student s = new Student(" ",1,1,100,60,76); 홍길동
String str = s.info();
System.out.println(str);
}
}
class Student {
       
       
       
       
     (문제)
       
       
       
}

클래스안에 알맞은 변수를 선언해주고 info() 메서드를 정의해주는 문제이다.

 

Class Student{
	String name;
    int ban;
    int no;
    int kor;
    int eng;
    int math;
    
    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;
}
 
 public String info(){
 	return name+","+ban+","+no+","+kor+","+eng+","+math+","+(kor+eng+math)
    +","+((int)((kor+eng+math) / 3f * 10 + 0.5f) / 10f)
    }
}

정답코드이다. 일단 각각 인스턴스변수를 선언해주었다. 그 후 학생의 정보를 매개변수로 받는생성자를 추가해주었다. 그 다음 선언해둔 인스턴스변수에 매개변수로 받은 값을 대입해주었다. 그 후 출력을 해주는 info()를 제작하였다. 더 간결하게 할수도 있었을거같은데 예시코드에서 문자열에 저장후 출력을 하기때문에 모든 정보를 리턴해주는방식으로 메서드를 제작하였다.

 

 

 

 

 

 

 

 

 

6-3 문제

문제에서 요구하는대로 코드를 작성하면 되는 문제다. 

 

class Student{
	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()
     }

작성한 정답코드이다.

6-2 문제와 마찬가지로 Student 생성자 클래스를 정의해주었다. Student(){}을 해준이유는 기본 생성자를 만들어 놓지않으면 컴파일오류가 발생하기 때문에 추가해주었다. getTotal()메서드는 과목들의 합을 리턴해 주도록 만들었다. getAverage() 메서드는 과목의 평균을 리턴해주었다. info()메서드에서는 구현했던것들을 토대로 정보를 출력해주도록 하였다.

 

 

 

 

 

 

 

 

6-4 문제

double getDistance(int x, int y, int x1, int y1){
	return Math.sqrt((x-x1)*x-x1) + (y-y1)*(y-y1)); 
}

작성한 정답코드이다. Math.sqrt()를 사용하라는것은 알려줬지만 뭘 넣어야될지몰라서 검색해보니 저렇게 x축 y축값끼리 빼주고 더해주면 되었다. 내부공식은 알아야할 필요가 없을거같아서 깊게 들여다보지않았다.

 

 

 

 

 

 

 

6-5 문제

변수들을 종류별로 구분만 하면 되는 문제였다.

- 클래스변수(static) : width, height

- 인스턴스 변수 : kind, num

- 지역변수 : k, n, args, card

 

 

 

 

 

 

 

6-6 문제

간단한 문제였다. 아까 6-4에서 작성한 메서드를 가지고와서 그대로 사용하였고 Mypoint를 정의하는 부분은 x, y만 생성해 주었다. 저 빨간위치에 생성된 변수는 인스턴스 변수이다.

 

 

 

 

 

 

 

 

6-7 문제

static을 어디에 붙여야하는지 찾고 설명을 하는것이었다. 일단 메서드 먼저 보았다. move(int x,int y)메서드는 인스턴스 변수에 매개변수로 받은 지역변수를 넣어주었기 때문에 static을 사용하지 않아도 된다고 생각했따다. 그리고 weaponUp() 메서드와 armorUp() 메서드는 공통적인 값을 가져야 하기 때문에 static을 붙여주었다. 그리고 이 메서드들이 사용하는 인스턴스 변수에도 static을 붙여주었다.

 

 

 

 

 

 

 

 

6-8 문제

정답은 2,5 이다.

2번은 생성자가 객체를 생성될때 사용되기는 한다. 하지만 객체를 초기화할 목적으로 사용한다. 객체를 생성하는것은 new 연산자이다.

5번은 생성자도 오버로딩이 가능하다. CHAPTER 6의 내용에 있다. 매개변수를 달리하면 여러개의 생성자를 정의할 수 있다.

 

 

 

 

 

 

 

 

 

6-9 문제

정답은 2번이다. this가 클래스 내의 어디서라도 사용이 가능하다고 나와있다. 하지만 static으로 선언된 클래스 맴버변수에는 사용할 수 없다. 인스턴스 메서드에서만 사용이 가능하다.

 

 

 

 

 

 

 

 

 

6-10 문제

 

정답은 3,4 이다.

3번 리턴타입은 오버로딩 하는 방법과 상관이 없다. 매개변수의 개수 또는 타입이 달라야 한다.

4번 매개변수의 이름이 달라야한다. 이것도 틀린말이다. 매개변수의 이름이 아닌 개수또는 타입이 달라야 한다.

 

 

 

 

 

 

 

 

 

6-11 문제

정답은 2, 3, 4번이다. 모든 메서드의 이름이 add이고, 매개변수의 타입이 다르기 때문에 오버로딩이 가능하다.

1번은 매개변수의 이름만 다르기 때문에 오버로딩을 할 수 없다.

 

 

 

 

 

 

 

 

6-12 문제

정답은 3, 5번이다. 

3번 초기화 블럭보다 생성자가 먼저 수행된다고 되어있다. 초기화에서는 블럭이 생성자보다 먼저 생성된다.

5번 클래스 변수가 먼저 초기화된다. 인스턴스 변수는 그 클래스의 인스턴스를 생성했을때 초기화된다.

 

 

 

 

 

 

 

 

 

 

6-13 문제

정답은 1번이다.

클래스변수의 초기화는 클래스가 처음 로딩될때 딱 한번 초기화 된다.

인스턴스변수의 초기화는 인스턴스가 생성될때마다 각 인스턴스별로 초기화가 이루어진다.

 

 

 

 

 

 

 

 

 

6-14 문제

정답은 1, 5번이다. 지역변수는 자동으로 초기화 되지 않는다. 그래서 지역변수를 사용하기 전에 반드시 초기화를 해주어야 한다. 지역변수는 호출스택(call stack)에 생성된다. 힙(heap)영역은 인스턴스가 생성되는 영역이다.

 

 

 

 

 

 

 

 

 

 

6-15 문제

정답은 2번이다. 호출스택의 제일 위에 있는 메서드는 현재 수행중인 메서드이다. 호출스택 안의 나머지 메서드들이 대기상태인것이다. 현재는 println메서드가 현재 수행중인것으로 알 수 있다.

 

 

 

 

 

 

 

 

6-16 문제

정답은 ABC123 / After change : ABC123 이다.

처음 ABC123은 그냥 그대로 출력하는것이고, 두번째는 왜 바뀌지 않았는지 생각할 수 있다. 처음에는 참조형이라서 문자열이 수정돼서 출력될것이라고 예상할 수 있다. 검색해보니 문자열의 불변성과 Java의 참조 동작에 의해 설명할 수 있따고 하였다. change(str)은 str+="456"한것을 새로운 문자열을 생성하고 그 새로운 문자열을 str에 할당 하는것이라고 설명하였다. 그러나 기존의 str변수는 변경되지 않는다. str변수는 main에서 선언한것과 별개의 변수가 된다.

 

 

 

 

 

 

 

 

 

 

6-17 문제

shuffle메서드를 만들어 주면된다.

 

public static int[] shuffle(int[] arr){
	if(arr==null || arr.length==0)
    	return arr;
        
    for(int i=0; i<arr.length; i++){
    	int j = (int)(Math.random()*arr.length);
        
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
        }
        
        return arr;
}

다음과 같이 코드를 작성 하였다. int[ ] arr를 매개변수로 받아왔다. 그 후 배열의 길이만큼 반복할것이고. int j에 배열의길이만큼의 랜덤한 숫자를 뽑아와서 섞어주었다. 그 후 어레이를 리턴해주면 끝이다.

 

 

 

 

 

 

 

 

 

 

6-18 문제

이번문제도 메서드만 만들면 된다. 

 

public static boolean isNumber(String str){
	if(str == null || str.equals(""))
    	return false;
        
    for(int i=0; i<str.length(); i++){
    	char ch = str.charAt(i);
        
        if(ch < '0' || ch > '9'){
        	return false;
        }
    }
    
    return true;
    
}

작성한 코드이다. 일단 true false로 반환해야하기 떄문에 boolean형식으로 리턴값을 지정해주었다. 넘겨받은 문자열이 null이거나 빈문자열이면 false를 반환하도록 하였다. 그 아래 for문에서는 배열의 길이만큼 반복하도록 하였고 ch에 str안에 있는 문자열을 하나하나 넣어주었다. 그 후 아래 if문에서 ch가 숫자가 아닌 다른게 들어가 있다면 바로 false를 반환하도록 하였고, if문에 걸리지 않는다면 아래로 내려가 true를 리턴하도록 생성하였다.

 

 

 

 

 

 

 

 

 

6-19 문제

너무 간단하지만 내용이 길어서 넘기도록 하겠다. 6-19 문제는 설명이 필요하지않다. 증감연산자(++, --)와 !연산자만 사용해주면 간단하게 종료된다.

 

 

 

 

 

 

 

 

6-20 문제

간단한 문제이다. 빨간색부분이 정답이다. 시작할때 arr가 null 이거나 넘겨받은 배열의 길이가 0이면 바로 -999999를 리턴해주었다. 그 후 배열의 첫번째값을 최대값으로 변경시킨후 최대값을 구해줬다. 최대값을 리턴해주면 끝이다.

 

 

 

 

 

 

 

6-21 문제

abs 메서드만 만들어 주면된다. 절대값을 반환하는 방법은 간단하다. int형 value를 매개변수로 넘겨받았으니 

value가 양수이면 그대로 리턴해주고, 음수이면 -를 붙여서 양수로 만든뒤 리턴해주었다.

 

 

 

 

정리

중간중간 모르는 개념도 많이 나와서 검색을 많이해보았다. 챕터가 지날수록 문제들이 생각을 많이 요구한다. 배웠던 것들을 계속 반복해서 공부하며 개념을 확실히 잡도록 해야겠다.

반응형
프로필사진

남건욱's 공부기록