본문 바로가기
IT/자바

getter setter toString 중복메소드

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

오늘은 즐거운 부처님 오신날이다

불자인 나는 절에 가려고 하다가 몸살이 크게 난 바람에

아쉽게도 가지 못하였다 

예전에는 감기몸살에 걸려도 하루 약먹고 자면 

낫곤 했었는데 30대가 되니 이젠 회복력이 많이 떨어졌나보다


더 나이가 먹으면 정말 잔병에도 크게 고생할듯 싶다

이제부터라도 운동도 하고 체력도 늘려서

되도록 잔병으로 아파하는일은 없도록 만들어야겠다


여러분도 자기 몸관리 철저히 하길 바란다

돈도 중요하지만 몸버리면서 하는일은 정말 

어릴때에나 하는게 맞는것 같다


고작 30대 주제에 뭔 엄살이냐고

따질 4~50대 분들에겐 미안하지만

오늘만큼은 20대들에게 충고 정도는 할수

있게 너그럽게 봐주길 바란다


금일 다뤄볼 복습내용은 getter와 setter이다

설명을 하기전에 예제 문제를 바로 보도록 하자


class Human { private String name; private int age; private String gender; public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public void setGender(String gender) { this.gender = gender; } public String toString() { String info = "name : " + name + "\n" ; info += "age : " + age + "\n"; info += "gender : " + gender; return info; } public void printHuman() { System.out.println(this); } } class UseHuman { public static void main(String[] args) { Human h = new Human(); h.setName("애봉이"); h.setAge(20); h.setGender("여자"); h.printHuman(); } }


먼저 알아야 할것은 private와 public이다

간단하게 말하자면 private는 자신만 변경가능한것이고,

public은 어느 누구나 변경이 가능하다는것이다

여기서 자신은 해당 class를 말한다


왜이렇게 구분을 했을까?

생각을 해보자

해당class의 객체가 만들어졌을때 

그객체의 데이터를 바꿔줄 경우가 생겨서

값을 변경하는데 기존class의 값마저 바뀐다면 큰 문제가 생긴다


하나의 객체만 생성된다면 이게 아무 상관없겠으나

여러개를 만들어 쓸때는 엄청난 문제를 야기한다


private와 public외에도 더 있지만 이건 추후에

생성자를 배운다음 설명하도록 하고,


getter와 setter에 집중해서 보도록 하자 

멤버변수 앞에 Set으로 표현된 메소드들이 보이는가?


가장 상위에 있는 setName을 예로 들어 설명하면

main문에서 Human형 객체를 생성한다음 ,

애봉이라고 이름을 주고 있다.

그아래로 20, 여자 라는 값을 넣어주고 있는데

이렇게 될경우 h의 이름과 나이 성별이

차례로 애봉이,20,여자로 설정된다


비슷한 다음예제를 보도록 하자


class Foo {
	private String name;

	public void setName(String name) {
		this.name = name;
	}

	public String toString() {
		return "this is a Foo(" + name + ")";
	}
}
class UseFoo {
	public static void main(String[] args) {
		Foo f = new Foo();
		f.setName("first");
		System.out.println(f);
		System.out.println(f.toString());

		Foo f2 = new Foo();
		f2.setName("second");
		System.out.println(f2);
	}
}


이것도 동일하다 Foo형 변수 f와 f2를 만들어주고

각각의 이름을 바꾸어주고 있다.


결과를 출력해보면 this is a ~~~형식으로 나온다

이건 toString때문에 그런것인데,

toString은 해당 객체의 값이나 자료를 문자열 

형태로 보여주는것이라 할수 있다


즉 사용자가 직접 지정한 문자열대로 출력된다

위에서는 this is a Foo( )형태로 지정했기 때문에

print해주면 그렇게 나오는것이다


class Box {
	private int width;
	private int length;
	private int height;

	public int getWidth() {
		return width;
	}
	public void setWidth(int width) {
		this.width = width;
	}
	public int getLength() {
		return length;
	}
	public void setLength(int length) {
		this.length = length;
	}
	public int getHeight() {
		return height;
	}
	public void setHeight(int height) {
		this.height = height;
	}
	public String toString() {
		String info = "width(" + width + "), length(" + length + ")";
		info += ", height(" + height + ")";

		return info;
	}

	public int getVolume() {
		return width * length * height;
	}
	public void print() {
		System.out.println(this);
	}

}
class BoxTest {
	public static void main(String[] args) {
		Box box1 = new Box();
		box1.setWidth(100);
		box1.setLength(100);
		box1.setHeight(100);

		box1.print();

		System.out.println(box1.getVolume());

		Box box2 = new Box();
		box2.setWidth(200);
		box2.setLength(200);
		box2.setHeight(200);
		box2.print();

		box1 = box2;
		box1.print();

	}
}


getter는 값을 얻어오는 역할을 한다

setter로 값을 지정해준다음 

다른곳에서 해당 객체의 값이 필요할때

getter로 얻어올수 있다


이 둘과 toString 역시 그냥 메소드 일뿐이다

메소드의 역할과 처리를 안다면 

이해하기 훨씬 빠르고 편할것이다


내가 설명을 너무 못하는게 

이해하기 힘든 꽤 큰 이유가 되겠지만

직접 쳐보고 출력하는 과정을 연속적으로 해보면

금방 흐름과 필요성을 알수 있게 될테니

많이 쳐보고 결과를 예상하고 확인해보자

반복에 반복이 실력을 늘리는데 가장 크게 도움이 된다


class MethodEx { /* 메서드 식별기준 1. 이름 2. 파라미터(갯수, 타입, 순서) ----------------------------- 리턴유무, 접근제한자는 기준이 아님 - method overloading (중복메소드) 클래스내부에 이름이 같은 메서드가 복수개 존재하는 현상 */ void doit() { }

public void todo() { } void todo(int n) { } void todo(String str) { } void todo(int n, String str) { } void todo(String str, int n) { } }


오늘의 마지막으로 중복메소드에 관하여 알아보자

메소드가 똑같은 이름으로 여러개 있을수 있을까?

정답은 그럴수 있다는것이다 


그러면 어떻게 구별해서 사용하냐고 생각해볼수 있는데

몇가지 조건에 의해서 구별이 가능하다


메소드는 크게 두가지 이름과 파라미터(매개변수)로

구분이 가능한데 중복메소드는 이름이 같으므로

파라미터의 수로 구분이 가능하다


예제에 나온 todo의 파라미터들에 주목해보자

이름은 똑같지만 옆에 매개변수들에 수와

자료형들이 다 다르다


이럴경우는 호출할때의 파라미터에 의해

사용되어지는 메소드가 결정이 된다


예를 들어서 todo(1) 이라고 할경우에는 

void todo(int n) { } 의 실행문이 실행될것이다


주의해야할점은 리턴유무와

접근제한자 (private , public 등등)

와는 전혀 무관하다는 것이다


많이 부족한 설명을 끝까지 본다고 고생하였다

물론 내가 복습을 위해서 하는 포스팅이긴 하지만

조금더 한눈에 보기 쉽게 정리하는 방법을 마련해야겠다고

요즘 뼈저리게 느끼고 있다


하나하나 신경써서 최종적으로는 

보기도 편하고 설명도 굿인

그런 형태로 바꾸어 나갈테니 

너그러운 마음으로 이해해주고

제발 내일도 내블로그에 놀러와주라

그럼 안녕!?!

반응형

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

[쉬어가는글1] OCJP와 정보처리기사  (0) 2017.05.06
자바 생성자 Static  (0) 2017.05.05
Class 두번째 복습과 this  (0) 2017.05.02
클래스 사용 연습 및 복습  (0) 2017.05.02
클래스 메소드 정확한 이해  (0) 2017.04.30

댓글