자바의 정석 문제풀이(챕터6)

bitna's study note·2022년 10월 29일
0

자바

목록 보기
111/119

10월 29일

문6-1

class Student {

	String name;
	int ban;
	int no;
	int kor;
	int eng;
	int math;
}

문6-2

package Java;

public class Test6 {

	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 {

	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;
	}
	
	String info() {
		
		int sum=kor+eng+math;
		double avg=sum/3.0;
				
		return name
				+","+ban
				+","+no
				+","+kor
				+","+eng
				+","+math
				+","+sum
				+","+String.format("%.1f",avg);
	}
	
}

Student s = new Student("홍길동",1,1,100,60,76);
이부분은 매개변수가 있는 생성자를 생성하라는 의미이고, 생성자를 하나라도 개발자가 작성하면 컴파일에서 자동으로 기본 생성자를 안만들어주니, 기본생성자도 넣어줘야함.
String str= s.info();
Student객체를 생성해줘서 참조변수 s가 생김(참조변수안에는 객체주소를 담고 있음)
Student객체안에 info() 메서드를 호출하므로 Student클래스에 메서드를 생성해줘야함.String str 는 메서드를 호출해서 String으로 받기 때문에 info()메서드의 반환타입도 String으로 받아줘야함.
메서드를 호출하여 담는 참조변수의 타입과 메서드의 반환하는 타입이 동일해야함.

문 6-3

package Java;

public class Test6 {

	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("평균:"+String.format("%.1f", s.getAverage()));

	}

}

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 getTotal()/3f;
	}
	
}

문 6-4

package Java;

public class Test6_4 {

	public static void main(String[] args) {
		System.out.println(getDistance(1,1,2,2));
	}

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

static 메서드 같은 경우 객체를 생성하지 않아도 사용이 가능하다.
Math.sqrt() 같은경우 static 메서드중 하나로 이것 또한 메서드 생성하지 않아도 사용가능 하다.

문 6-5

package Java;

class PlayingCard{
	int kind; //인스턴스 변수
	int num; //인스턴스 변수
	
	static int width; //클래스 변수
	static int heigth; //클래스 변수
	
	PlayingCard(){} //기본 생성자
	
	PlayingCard(int k, int n){ //매개변수
		kind=k; //지역변수
		num=n; //지역변수
	}
}

public class Test6_5 {

	public static void main(String[] args) { //args는 참조변수,지역변수
		PlayingCard card= new PlayingCard(1,1); //card는 참조변수,지역변수
	}

}

args와 card는 main메서드의 지역변수임.

문 6-6

package Java;

class MyPoint{
	int x; //인스턴스 변수
	int y; //인스턴스 변수

	MyPoint(){} //기본 생성자
    
    MyPoint(int x, int y) { //매개변수가 있는 생성자 
		this.x = x;
		this.y = y;
	}
	
	double getDistance(int x1,int y1) { //인스턴스 메서드
		return Math.sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1));
	}

}

public class Test6_4 {
	public static void main(String[] args) {
		
		MyPoint p = new MyPoint(1,1); //인스턴스 생성
		
		System.out.println(p.getDistance(2, 2)); 
	}
}

문 6-4 는 static 메서드를 인스턴스 메서드로 고치는 문제인데, 먼저 인스턴스변수를 선언하고, static 메서드에서 static을 뺌.
MyPoint(int x, int y) { //매개변수가 있는 생성자
this.x = x;
this.y = y;
}
매개변수가 있는 생성자를 만들어
MyPoint p = new MyPoint(1,1); //인스턴스 생성
메인에서 인스턴스 객체를 만들때 초기화 시켜줌
p.getDistance(2, 2)
호출 할때는 매개변수가 있는 메서드로 만들어 호출함.
그래서 x,y는 생성자에서 초기화 해서 값을 넣어주고 x1,y1 는 인스턴스 메서드로 매개변수로 넣어주면서 값을 세팅해줌.

문 6-7

class Marine{
	int x=0, y=0; 
	int hp=60;
	
	static int weapon=6;
	static int armor=0;
	
	static void weaponUp() {
		weapon++;
	}
	
	static void armorUp() {
		armor++;
	}
	
	void move(int x, int y) {
		this.x=x;
		this.y=y;
	}
}

문제 단서에 모든 병사의 공격력과 방어력이 같아야 한다는 단서가 있으므로 이건 공통적인 요소이기 때문에 weapon,armor 변수에 static을 붙이고, 메서드에 static붙여주는 이유는 static변수를 가지고 작업을 하기 때문에 static을 붙여줌.

문6-8

답)2,5
생성자는 객체를 생성하기 위한 것
->생성자는 객체를 초기화 하기 위함,객체를 생성하는 것은 new 연산자.
생성자야 말로 오버로딩을 통해 여러개를 만들수 있음.

문6-9

답)2
클래스 내에서라면 어디서든 사용할 수 있다.
->클래스멤버(static이 붙은 변수나 메서드)에는 사용할 수 없다.
this는 인스턴스 자신을 가르키기 때문에 클래스멤버(static이 붙은 변수나 메서드) 같은경우 static메서드가 호출된 시점에 인스턴스가 존재하지 않을 수도 있기 때문.
모든 인스턴스메서드에 숨겨진 채로 존재하는 지역변수로 인스턴스메서드 내에서만 사용할수 있다.

문6-10

답)3,4
리턴타입이 달라야 한다.
->리턴타입이 같거나 달라도 상관이 없음.

매개변수 이름이 달라야 한다.
->오버로딩은 매개변수이름이 같고 매개변수 타입이나 갯수가 달라야 한다.

문6-11

답)2,3,4
int add(byte a,byte b){return a+b}
byte타입은 int타입으로 자동변환이 가능하다.

문6-12

답)3,5
초기화 블럭보다 생성자가 먼저 수행된다.
->초기화 블럭이 먼저 수행된다.

클래스 변수보다 인스턴스 변수가 먼저 초기화 된다.
->클래스 변수가 먼저 초기화 됨.
클래스변수는 클래스가 처음 메모리에 로딩될때, 자동 초기화되므로 인스턴스 변수보다 먼저 초기화 된다.그리고 생성자는 초기화 블럭이 수행된 다음에 수행된다.

문6-13

답)1
클래스변수의 초기화순서:기본값->명시적초기화->초기화블럭->생성자
인스턴스변수의 초기화순서:기본값->명시적초기화->초기화블럭->생성자

문6-14

답)1,5
지역 변수는 자동으로 초기화 되지 않기 때문에 사용전에 반드시 적절한 값으로 초기화 해주어야한다.
힙 영역은 인스턴스가 생성되는 영역이며, 지역변수는 호출스택에 생성된다.
그래서 메서드가 작업이 종료가 되면 자동으로 소멸 된다.

문6-15

답)2
호출스택 제일 상단에 있는 메서드가 현재 실행상태 메서드이며, 아래에 쌓여있는 메서드는 대기상태이다. 상단에 있는 메서드가 종료되면서 순차적으로 메서드 실행하고 종료시킴.

문6-16

답)ABC123
After Change:ABC123
호출스택에서 main위에 Change()가 호출되고 메서드 완료후 사용하던 메모리를 반환한다. 그때 Change()의 지역변수인 str역시 메모리에서 제거된다.
지역변수는 호출스택에 생성되었다가 메서드작업종료와 동시에 소멸하기 때문.

문6-17

package Java;

public class Test6_17 {
	
	public static int[] shuffle(int[] arr) {
		if(arr==null||arr.length==0) { //arr배열이 0이거나 null이면 걸름
			return arr;
		}else {
			for(int i=0;i<arr.length;i++) { //숫자 뒤섞는 기능
				int j=(int)(Math.random()*arr.length); 
				int tmp=arr[i]; 
				arr[i]=arr[j];
				arr[j]=tmp;
			}
			return arr;
		}
	}

	public static void main(String[] args) {
		
		int[] original= {1,2,3,4,5,6,7,8,9};
		System.out.println(java.util.Arrays.toString(original));
		
		int[]result=shuffle(original);
		System.out.println(java.util.Arrays.toString(result));
		
	}

}

배열 까묵었다;; 메인이 static메서드 이므로 shuffle또한 static 메서드로 바꿔줘야하고, toString또한 static메서드인데, 사용할때 import를 해주거나 이렇게 패키지명과 클래스네임을 풀로 적어주기도함.

문6-18

package Java;

public class Test6_18 {
	
	public static boolean isNumber(String str) {
		int sum=0;
		
		for(int i=0;i<str.length();i++) {
			int num=str.charAt(i)-48;
				
			if(0<=num&&num<=9) {
			sum++;
			
			}else if(!(0<=num&&num<=9)){
			
			}else if(str==""||str==null) {
			return false;
			}
		  }
		
		if(sum==str.length()) {
			return true;
		}else {
			return false;
		}
			
	}
		
		
	
	
	
	public static void main(String[] args) {
	
		String str="1234";
		System.out.println(str+"는 숫자입니까"+isNumber(str));
		
		str="1234o";
		System.out.println(str+"는 숫자입니까"+isNumber(str));
	}
}

풀긴 풀었는데, 뭔가 꼬아서 푼거 같기도하고...나는 charAt()가 0~9까지 구분이 된다는걸 모르고 char타입으로만 받아지니까 아스키코드로 구분할려다보니 뭔가 길어졌심...

문6-19

package Java;

class MyTv{
	boolean isPowerOn;
	int channel;
	int volume;
	
	final int MAX_VOLUME=100;
	final int MIN_VOLUME=0;
	final int MAX_CHANNEL=100;
	final int MIN_CHANNEL=1;
	
	void turnOnOff() {
		if(isPowerOn==true) {
			isPowerOn=false;
		}else {
			isPowerOn=true;
		}
		
		//isPowerOn=!isPowerOn;
	}
	
	void volumeUp() {
		if(volume<MAX_VOLUME) {
			volume++;
		}
	}
	
	void volumeDown() {
		if(MIN_VOLUME<volume) {
			volume--;
		}
	}
	
	void channelUp() {
		if(channel==MAX_CHANNEL) {
			channel=MIN_CHANNEL;
		}else {
			channel++;
		}
	}
	
	void channelDown() {
		if(channel==MIN_CHANNEL) {
			channel=MAX_CHANNEL;
		}else {
			channel--;
		}
	}
	
}

public class Test6_19 {

	public static void main(String[] args) {
		MyTv t = new MyTv();
		
		t.channel=100;
		t.volume=0;
		System.out.println("CH:"+t.channel+",VOL:"+t.volume);
		
		t.channelDown();
		t.volumeDown();
		System.out.println("CH:"+t.channel+",VOL:"+t.volume);
		
		t.volume=100;
		t.channelUp();
		t.volumeUp();
		System.out.println("CH:"+t.channel+",VOL:"+t.volume);
		
	}

}

turnOnOff()는 풀이 보니까 더 쉽게 짤수 있는 식이 있어서 내가 짠것보다 isPowerOn=!isPowerOn; 이게 더 좋은 풀이 인거 같다.
참고로 final붙은 거는 변수에 선언 했기 때문에 상수이다. 값이 절대 변하면 안되는값

문6-20

package Java;


public class Test6_20 {
	
	public static int max(int [] arr) {
		
		int num=0;
		
		if(arr==null||arr.length==0) {
			return -999999;
		}else {
			for(int i=0;i<arr.length;i++) {
				
				if(num<arr[i]) {
					num=arr[i];
				}
			}
			return num;
		}
	}
	
	public static void main(String[] args) {
		int [] data= {3,2,9,4,7};
		System.out.println(java.util.Arrays.toString(data));
		System.out.println("최대값:"+max(data));
		System.out.println("최대값:"+max(null));
		System.out.println("최대값:"+max(new int[] {}));
		
	}

}

이번것도 내방식 대로 풀음
특이한건 나는 비교숫자를 초기화 할때 for문 바로위 메소드내 지역변수로 선언함.
간혹 for문 안에 변수를 선언하는 경우가 있는데 그럴 경우 for문을 다돌면 변수도 같이 사라지기 때문에 메서드에서 변수를 기억할려면 for문 밖에서 선언 해야 한다.
참고로 메인메서드가 static이기 때문에 max()메서드도 static이다.

문6-21

package Java;

public class Test6_21 {
	
	public static int abs(int value) {
		if(value<0) {
			return -value;
		}else {
			return value;
		}
	}

	public static void main(String[] args) {
		int value=5;
		System.out.println(value+"의 절대값:"+abs(value));
		value=-10;
		System.out.println(value+"의 절대값:"+abs(value));
	}

}

이것도 내식대로 선생님 풀이보면 삼항연산자로 풀이해 놓음
return value>=0 ? value:-value;
이렇게 풀이해 놓음.

profile
좋은개발자가 되기위한 삽질기록 노트

0개의 댓글

관련 채용 정보