본문 바로가기
IT/자바

Class 두번째 복습과 this

by 독서실총무J 2017. 5. 2.
반응형

티스토리로 블로깅 하는게 생각보다 많이 불편하다

네이버만 써온터라 자동으로 다 되던것들이 

여기서는 직접 등록하는 과정을 거쳐야 한다

다음이 열심히 일해서 네이버에게 덤빌 정도가 빨리 되었으면 좋겠다

그렇지 않아 앞으로도 N검색에 띄우려고 눈치를 봐야한다면 

다시 돌아가고픈 생각이 들지도 모르니까 말이다 


생각해보니 이래서 사람들이 내집 마련을 하려고 그렇게 발악하나보다

전세 월세 사는 그 불편함을 집사기도 전에 

블로그 때문에 깨닫게 되다니 어찌보면 좋은걸 배웠다고도 볼수 있겠다


Class에 관한 이야기로 벌써 3번째 시간이다

어제 많은 되새김질을 했다고 한다면 

오늘 다룰 내용의 강의를 들었을때는 우리가 

직접 손으로 쳐보는 과정을 많이 겪었었다


최종적으로는 주사위게임을 만들었었는데,

직접 만든 프로그램은 이때 처음이라서 

많이 호들갑 떨었떤 기억이 난다


무엇이든지 처음의 기억이 애틋하게 느껴진다고 한다

소중함에 익숙해지면 애틋함은 자동적으로 줄어들수 밖에 없지만

그때를 회상하며 다시 복습해보도록 하자


class Sample1 { public void plus2(int num) { num += 2; } } class Think1 { public static void main(String[] args) { Sample1 s = new Sample1(); int n = 4; int num = n; num += 2; System.out.println(n); } }


첫번째 Think 클래스

출력 결과는 무엇일까?

당연히 4가 될것이다

이건 고민해볼 가치도 없는 문제이다


class Bar { int num = 2; } class Sample2 { public void plus2(Bar b) { b.num += 2; } } class Think2 { public static void main(String[] args) { Bar o = new Bar(); Sample2 s = new Sample2(); Bar temp = o; temp.num += 2; System.out.println(o.num); } }


두번째 Think 클래스

출력결과는?

이것 역시 4가 되겠다

주목해야 할점은 Bar temp = o;

우리가 만든 Class형의 변수도 담아줄수 있다는걸 알아야한다


class Bar2 {
	int num = 2;
}
class Sample3 {
	void plus2(int n) {
		n += 2;
	}
}
class Think3 {
	public static void main(String[] args) {
		Bar2 b = new Bar2();
		Sample3 s = new Sample3();
		s.plus2(b.num);
		System.out.println(b.num);
	}
}


마지막 Think 클래스이다.

결과는 무엇이될까? 바로 2이다

여기서 착각하면 안되는것은 b.num이 

s.plus2의 매개변수로 사용되었다고 해서 

b.num의 값이 변경되는게 아니라는것이다


대체로 헷갈려 하는 사람들이 없긴하지만

걔중에 한명씩 있기 때문에 설명해준걸로 기억한다


절대 헷갈려해선 안된다

plus2의 매개변수에는 정수가 필요할뿐이다


class Car {

	public void start() {
		System.out.println("1");
		check_engine();
		System.out.println("5");
	}
	private void check_engine() {
		System.out.println("2");
		check_oil();
		System.out.println("4");
	}
	private void check_oil() {
		System.out.println("3");
	}
	
}
class CarTest {
	public static void main(String[] args) {
		Car c = new Car();
		c.start();
	}
}


이부분에 대해서도 한번 생각해보자

요번에 중점적으로 볼 내용은 실행 순서이다

메소드가 어떤 순서로 실행되는지 주목해서 보자

결과는 보기 쉽게 1부터 5까지로 되어있는데

호출되는 과정을 잘 보아야 하겠다


학원 친구들 중 프로그래밍을 처음 배우는 친구가 있었는데

이부분을 상당히 헷갈려 했던걸로 기억한다


당신도 처음 해본다면 꼭 정확하게 알고 넘어가야할것이다

흐름을 모르면 프로그래밍은 할수 없다


main문에 있는 c.start에서 시작하여 ,

check_engine , check_oil순으로 메소드가 실행되며

각 메소드가 호출되어 시작하고 끝나서 다시 돌아오는 과정을

정확하게 알아야 하겠다


class First {
	void printFirst() {
		System.out.println("First : " + this);
	}
}
class Second {
	void printSecond() {
		System.out.println("Second : " + this);
	}
}
class ThisEx {
	public static void main(String[] args) {
		First f = new First();
		Second s = new Second();

		f.printFirst();
		s.printSecond();
	}
}


Class 복습을 끝내고 this를 살펴보도록 하자

this를 한마디로 요약하자면 '자기 자신'이다


현실세계에서 '힘내 나자신!'

이런식으로 이 단어를 쓰게 된다면

매우 오글거려 시공간이 사라질수도 있지만

자바에서는 자주 쓰이게 되는 this이므로 

정확하게 알고 넘어 가야겠다


First에서 말하는 this는 무엇일까?

Second에서 말하는 this는 또 무엇일까?


실행시 나오는 답을 바로 말하자면

this부분에 각 클래스의 주소값이 찍혀 나온다

즉, this는 그 클래스 자신을 말한다고 볼수 있다


이 정의만 제대로 알면 후반에 가서 

코드를 짜는데 아주 수월해지므로 반드시 알아야 할것이다


주소값에 대한 언급은 다음으로 미루도록 하겠다

그냥 그게 있구나 하고 생각하고 넘어가주길 바란다


class Foo { int num = 2; void setNum(int num) { this.num = num; } void printNum() { int num = 4; System.out.println(num); System.out.println(this.num); } void printAddr() { System.out.println("this의 주소 : " + this); } } class UseFoo { public static void main(String[] args) { Foo f = new Foo(); f.setNum(5); System.out.println("f의 주소 : " + f); f.printAddr(); } }


다음에 다룰 생성자 사용시에도 this를 사용해주는데

이건 그때가서 생각해보도록 하고..


여기서 사용되는 this들은 다 누구의 자신이겠는지

한번 스스로 맞춰보길 바란다

뭐 하나뿐이라서 맞추고 자시고 할것도 없지만 말이다


import java.util.*;

class DiceGame {

	private int diceFace;
	private int userGuess;

	private int rollDice() {
		return (int)(Math.random() * 6) + 1;	
	}
	private int getUserInput()	{
		System.out.println("예상값을 입력하시오: ");
		Scanner s = new Scanner(System.in);
		return s.nextInt();
	}
	private boolean checkUserGuess(){
		if( diceFace == userGuess ) {
			System.out.println("맞았습니다");
			return false;
		} else {
			System.out.println("틀렸습니다");
			return true;
		}
	}	
	public void startPlaying()	{
		/*
			1. 주사위 눈 결정
			2. 입력
			3. 판정
			2->3 정답일때 까지 반복
		*/

		// 주사위 눈 결정
		diceFace = rollDice();		
		do {
			// 사용자 입력
			userGuess = getUserInput();
		} while(checkUserGuess());		// 판정
		
	}
}

public class DiceGameTest {
	public static void main(String[] args) {
		DiceGame game = new DiceGame();
		game.startPlaying();	
	}
}


마지막으로는 제일 처음에 말했던 다이스 게임이다

직접 짜보았고 강사님이 최종적으로 설명해준 것이다

단순한 알고리즘이지만 당시에는 굉장히 힘들었다

그리고 변수나 클래스, 메소드 이름을 정해주는게 생각보다

어렵다는걸 절실하게 느꼈던 과정이기도 하다


가독성을 위해서는 작명센스는 기본적으로 갖춰야한다

혼자만 하는 프로그래밍이 아니기 때문이다


알고리즘은 코드내에 주석처리 되어있는 부분에 설명되어있다

random함수의 사용으로 눈을 결정하고 

사용자 입력후 정답 유무를 판정하는 과정을 내포하고 있다


random함수는 나중에 로또게임을 만들때도 유용하게 사용했었는데

아마 우리가 그렇게도 욕하고 욕하는

모바일게임의 확률을 조절할때에도 쓰일것이다


코드에 대해서 살펴보고자 하는 분이 있다면

먼저 흐름을 이해해보고,

다음으로 각각의 이름을 신경써서 보도록하자


많은 도움이 될것이다

나도 그러했고 말이다


황금연휴다 뭐다 해서 독서실도 오늘은 조용한데

손님이 적은거 빼고는 취준인 내입장에선 황금연휴는 정말 지옥이다


집에 가족들이 모두 쉬기 때문에

내일부턴 자다가 눈뜨자마자 독서실로 직행해야 할삘이다

덕분에 내일 포스팅 부터는 조금 일찍 할수도 있을것 같다


쩝, 모두 연휴 잘 보내시길~

반응형

'IT > 자바' 카테고리의 다른 글

자바 생성자 Static  (0) 2017.05.05
getter setter toString 중복메소드  (0) 2017.05.03
클래스 사용 연습 및 복습  (0) 2017.05.02
클래스 메소드 정확한 이해  (0) 2017.04.30
조건문 switch 반복문 while for  (0) 2017.04.29

댓글