본문 바로가기
IT/자바

자바 생성자 Static

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

반갑다 하루만에 감기몸살을 이겨내고 돌아온 독서실총무이다

매일 포스팅을 쓰면서 느낀건데

계속 반말로 쓰려니 사실 보는 사람 입장에서는

기분이 매우 나쁠수도 있겠다 싶다


기존에 복습을 위해서, 나혼자 보기 위해서 

쓰려고 맘먹었던거라 높임말에 대해서 생각을 안해봤는데

부실한 포스팅에도 누군가는 봐주고 있다고 

생각하니 말투를 바꿔야 되나 고민중이다


이런건 쓰는 입장보다는 

보는 입장의 의견이 매우 중요하니

이글을 본 당신이 느낀점을 꼭 댓글로 달아주길 바란다


믿기 힘들겠지만 나도 어디가서 망나니라는 소리보다는

착하다는 소리를 많이 듣는 편이라 양심은 있다


높임말을 원한다면 댓글을 꼭 남겨주길 바라며

오늘 복습할 내용에 대해서 살펴보자


크게 두가지이다

생성자와 Static이 그것인데,

이 둘을 정확하게 알고 넘어가야 

뒤로 갈수록 편해지니 눈뜨고 잘 보자


class Date { private int year; private String month; private int day; public Date() { // 기본 생성자 setDate(2009, "1월", 1); /* month = "1월"; day = 1; year = 2009; */ } public Date(int year, String month, int day) { // 생성자 setDate(year, month, day); } public Date(int year) { // 생성자 setDate(year, "1월", 1); } public void setDate(int year, String month, int day) { this.month = month; // this는 현재 객체를 가리킨다. this.day = day; this.year = year; } } public class DateTest { public static void main(String[] args) { Date date1 = new Date(2009, "3월", 2); // 2009.3.2 Date date2 = new Date(2010); // 2010.1.1 Date date3 = new Date(); // 2009.1.1 } }


아래쪽에 있는 main문을 봐주길 바란다

객체를 생성하는데 date 1 부터 3까지 다른 형태인걸 알수 있다

뒤에 주석을 보면 해당 객체가 어떻게 초기화되는지를 보여준다


우리가 만들고자 하는 객체가 

모두 동일한 데이터를 가지고 있진 않을것이다

하나하나 setter로 초기화 하려고 한다면 코드가

꽤 길어져서 번거로운 작업이 필요할것이다


생성자는 생성시부터 값을 초기화 할수 있게 해준다


이번엔 Date 클래스에서 생성자를 어떻게 지정해주는지 보자

setter를 사용해도 되고 , 주석에 표현된것 처럼 해도 된다

아니면 this를 사용해도 동일한 기능을 한다


/*
	컴파일러가 생성자 존재유무를 검사한다.
	생성자가 존재하지 않는 클래스라면
	컴파일러가 기본생성자를 만들어준다.

	생성자와 메서드의 차이점
	- (생성자는) 리턴이 없다.
	- (생성자는) 객체생성시에만 호출가능
*/

class Human {
	private int age;
	private String name;
	// 생성자
	public Human(int age) {
		setAge(age);// A
	}
	public Human(int age, String name) {
		// this.age = age;	// A
		/*
			1. this 를 이용해서 다른 생성자를 호출가능하다.
				- 반드시 생성자의 첫번째 연산으로 존재해야함
				- 생성자내부에서만 사용가능함.
		*/
		setAge(age);
		this.name = name;	// B
		
	}
	public void setAge(int age) {
		this.age = age;
	}
}
class UseHuman {
	public static void main(String[] args) {
		Human h = new Human(20);
	}
}


this로 생성자를 지정해줄때에는

주석에 나와있는것 처럼 첫번째 연산에 위치해야 한다

이것은 나중에 알게될 super의 경우와도 동일한데 

그건 나중에 생각해보도록 하고 ,

지금은 this는 가장 처음이라고 인지해두자


생성자에서 주목해야 할점은

매개변수가 꼭 해당 멤버변수만큼 있을필욘 없다는거다

하나만 넣어도 되고 , 두개 , 또는 모두 넣어줘도 된다.

그러나 지정해줄때의 순서를 꼭 지켜줘야 한다


당신이 만들고자 하는 프로그래밍에서

쓰일 객체의 활용도에 따라서 

생성자를 여러개 만들어도 되니

정확하게 알아두고 사용하는것이 좋다


class Other {
	static int some = 5;
	public static void todo() {
		System.out.println("Other's todo");
	}
}
class StaticEx1 {
	
	int n = 2;
	static int some = 4;	

	public static void main(String[] args) {
		Other.todo();
		System.out.println(Other.some);
		StaticEx1 s1 = new StaticEx1();
		System.out.println(s1.n);
	}
}


static은 c언어를 배운사람이라면

전역변수라고 알아두면 이해하기 편하다

한마디로 어디서나 쓸수 있는 그런 형태이다


지금 여기서는 StaticEx1과 Other에 

각각 some이 static으로 표현되고 있다

예상하여 보자 

어디서나 쓸수있는 변수이다


main문에서 Other.some을 println하면 5가 찍힐것이다

여기서 static을 뺀다면 어떻게 될까?

뺴고 실행해보면 에러가 뜰것이다

non - static이라면서 말이다


class Foo {
	public static int num = 2;

	public static int getNum() {
		return num;
	}
}
class StaticEx2 {
	public static void main(String[] args) {
		Foo f = new Foo();
		System.out.println(Foo.num);
		System.out.println(Other.some);
		System.out.println(StaticEx1.some);

		Foo f2 = new Foo();
		System.out.println(Foo.num);
	}
}


println 실행문에 대해서 스스로 생각해보자

어떻게 처리되겠는가?

그리고 static을 빼주면 

결과는 어떻게 달라질것 같은가

한번 직접 알아보길 바란다


꽤 편리해보이는 static이지만

코딩을 잘하시는 분들은 

쓰지말길 권하곤 한다

왜그럴까?


그것은 코드가 꼬이기 때문이라고 한다

나도 학부생 정도의 길이밖에 겪어보지 못한터라

크게 느껴본적은 없는데

현직에 종사하시는 분들의 말씀으로는

전역변수를 남발할수록

코드가 꼬여 나중에는 돌이킬수 없게

될수도 있다고 한다


static을 사용하지 않고도 

똑같은 실행은 충분히 가능하니

앞으로 연습하면서 배워나가도록 하자


class StaticEx3 {

	{
		System.out.println("non-static");
	}

	static {
		System.out.println("static");
	}


	public static void main(String[] args) {
		new StaticEx3();
		new StaticEx3();
		new StaticEx3();
		new StaticEx3();
	}
}


뭔가 싶을거다

나도 처음에 그렇게 느꼈었다

이런 형태의 문장도 있구나 싶다

웃긴건 오류없이 실행이 잘만된다!


결과가 어떻게 나올지 예상이 되는가?

찍어보면 알겠지만

static이 먼저찍히고 

뒤이어서 non-static이 4번 찍힌다

무엇을 보여주기 위한 예제일까?


우리가 치는 코드들은

메모리에 올라간 순서대로 처리된다


그런데 static이 앞에 붙으면

가장 먼저 메모리에 올라탄다

즉 바로 사용이 가능하다는것이다



어째 갈수록 포스팅 길이가 짧아지는것 같다

하나당 3천자만 채우자 하는게 의외로 독이 되는걸지도 모르겠다

3천 채우자마자 고만 써야지 하는 생각이 드니까 말이다


최근에 걱정거리였던 네이버 노출도

어제부로 잘되는것 같은데

내일부터라도 길게 써볼려고 노력해야겠다



반응형

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

상속과 Override 메소드 재정의  (0) 2017.05.06
[쉬어가는글1] OCJP와 정보처리기사  (0) 2017.05.06
getter setter toString 중복메소드  (0) 2017.05.03
Class 두번째 복습과 this  (0) 2017.05.02
클래스 사용 연습 및 복습  (0) 2017.05.02

댓글