728x90

이 강의는 자바의 프로젝트를 어떻게 만드는지, 또한 빌드를 어떻게 하는지에 대한 강의를 진행하지 않는다.

그러나 자바의 기본적인, 그리고 자바에 필수적인 기능들도 분명 존재하고 이 블로그엔 그 작업에 필요한 포스팅도 함께 제공하고 있다.

그 정보를 확인하고 싶다면 여기를 참조하라. 양이 조금 되고 현재진행형으로 늘어나고 있으므로 페이지내의 찾기(ctrl+f 나 cmd+f)로 찾아보도록하자.


자바는 객체지향언어라는 말을 많이 들었을것이다. 사실 많이 듣고 안듣고는 별로 중요하지 않다. 자바는 객체 지향 언어이다.

객체 지향 언어라는 말은 일반인들, 즉 프로그래밍에 막 입문한 사람 입장에서는 생소한 개념이다.

왜냐하면 필자는 항상 드는 생각인데 객체라는 말 자체가 뭔가 어설프다.

한국에서는 객체라는 말을 잘 안쓰기 때문이다. 굳이 한국 말로 대체하려고 해도 필자 생각에는 대체할 말이 굳이 없다.

그냥 Object를 지칭하는 객체라는 말이 제일 가까운것 같기는 하다.


객체를 제대로 이해하는 것은 말로 설명하는 것보다 앞으로도 계속 써가면서 느끼는 것이 중요하다.

정말 이해가 안된다면 일단은 물건이라고 생각하는게 접근하는데 더 편할 수 있다.


클래스


자바에서 객체는 클래스로 만든다. 사실 어원이 왜 클래스인지는 필자도 잘 모르겠다.

객체와 클래스는 조금은 다른 개념인데 일반적인상황에서 클래스=객체라고 봐도 의사소통에 지장은 없다.


클래스는 객체를 명세해놓은 것이라고 생각하면된다. 명세라는 말은 클래스를 정의해 놓았다는 뜻이다.

그러면 클래스를 이해하기전에 객체를 이해해야하는데 객체는 여러가지 속성,기능들의 묶음이라고 할 수 있다.


좀더 프로그래밍 적으로 이해하지면 변수와 함수를 하나의 단위로 묶은 것이다.

아래는 간단한 클래스를 만든 예제이다.


public class Pokemon {
String name;
int hp;
String skill1;
String skill2;
String skill3;
String skill4;

String status() {
return "포켓몬의 이름은 " + name + ", 체력은 " + hp + "입니다.";
}
}


클래스는 변수와 함수의 묶음이라고 말했다.

위의 예제는 포켓몬을 클래스로 구현한 것이다.

이 포켓몬이라는 클래스는 총 6개의 변수와 1개의 함수를 가지고 있다.


여기서 용어 정리를 할 시간이다.

클래스 내부에서 사용하는 변수는 Field(필드)라고 부른다.

클래스 내부에서 사용하는 함수는 Method(메소드)라고 부른다.


메소드와 필드는 클래스에 귀속된 변수이다.

메소드나 필드에서는 같은 클래스 내부의 변수의 접근이 자유롭다.

예를들어 위의 메소드 status의 경우 파라메터로 아무것도 받지 않았지만 필드인 name과 hp를 참조했다.


new와 인스턴스화


클래스는 이제 객체를 구상한것이지만 구상한거에 불과하지 아직까지 실체화 되지 않았다.

이렇게 실체화되지 않은 클래스를 null이라고 한다.

null상태는 굉장히 중요한 상태이다. 왜냐하면 아직 아무 인스턴스를 가지지않았다는 것을 알 수 있기 때문이다.


실체화 되지 않았다는 개념에 대해서 어렵게 생각할거 없다.

예를들어서 String같은 문자열 객체는 누군가에 의해서 어떻게 만들지에 대한 명세는 되어있지만

그 자체가 만들어진건 아니다. 이제 이것을 현실화 시켜주는 작업이 남아 있다. 이것이 인스턴스화이다.

즉 클래스는 도면에 불과하고 이걸 만들었다고해서 실체가 있는 것은아니다.

그걸 실체화 시켜주는 방법을 아래의 예시들을 통해서 확인하도록 하자.


객체를 만드는  가장 간단한 이유는 특정한 이슈를 하나로 묶기 위함이다.

예를 들어서 포켓몬을 표현하기 위해서 객체를 사용하지 않는다고 해보자.

아래는 그 예시이다.


public class Main {
public static void main(String[] args) {
String name1 = "피카츄";
int hp1 = 50;
String technic1x1 = "백만볼트";
String name2 = "꼬부";
int hp2 = 25;
String technic2x1 = "물대포";
System.out.println("포켓몬의 이름은 " + name1 + ", 체력은 " + hp1 + "입니다.");
System.out.println("포켓몬의 이름은 " + name2 + ", 체력은 " + hp2 + "입니다.");
}
}


보다시피 하나로 묶여있다는 느낌을 받기 힘들다.

느낌 보다 중요한건 만약 새로운 포켓몬을 추가해야할때이다. 그 경우에도 일일이 하나하나씩 증가시켜줘야한다.

만약 객체를 쓴다면 아래와 같이 사용할 수 있을 것이다.


public class Main {
public static void main(String[] args) {
Pokemon p1 = new Pokemon();
Pokemon p2 = new Pokemon();

p1.name = "피카츄";
p1.hp = 50;
p1.skill1 = "백만볼트";

p2.name = "꼬부";
p2.hp = 25;
p2.skill1 = "물대포";

System.out.println(p1.status());
System.out.println(p2.status());
}
}


이 코드를 보면 객체 단위로 묶여있다는 느낌이 강하게 든다.

또한 새 포켓몬을 추가할 경우에의 문제도 쉽게 해결할 수 있다.


Pokemon p = new Pokemon();


배열시간때도 new를 사용했었다. 짤막하게 언급한적이 있는데 사실 배열역시 클래스이다.

그러나 아직 이런 부분은 신경쓰지 않아도 좋다.

어쨋던 클래스들은 일반 int와 char같은 기본타입들과는 다른 실체화를 시켜주는 작업이 필요하다.

그렇기 때문에 new라는 연산자를 사용한다. new뒤에는 생성자를 선언하는데

생성자에 대한 설명은 다음 장에서 하도록 하자.

어쨋던 new를 선언해서 원래 클래스 이름을 호출하면 Pokemon p라는 변수는 실체가 없는 상태에서

new Pokemon()이라는 구문 덕분에 실체를 가지게 된것이다.


디폴트 초기화


우리는 위에서 사용하기전에 항상 초기화를 해주었다.

만약 사용하기전에 초기화가 되지 않았다면 어떻게 될까?

과연 어떤 결과가 나올까?

백문이 불여일견이므로 한번 테스트를 해보는게 제일 좋을것이다.


public class Square {
int x;
int y;
boolean b;
}

public class Main {
public static void main(String[] args) {
Square s = new Square();
System.out.println(s.x);
System.out.println(s.y);
System.out.println(s.b);
}
}


해당 코드를 실행해보면 어떤 결과가 나오게될까?

아마 int형은 0으로, 그리고 boolean형은 false가 되게 될것이다.

초기화를 하지 않고 사용한다고 하더라도 에러가 나지 않는다.

이는 에러를 내뱉는 다른 언어들과의 차이점이라고 할 수 있다.


디폴트 초기화 규칙

1.숫자형들(정수형들과 실수형들)은 0으로 초기화 된다.

2.부울린형들은 false로 초기화된다.

3.클래스형들은 null로 초기화된다.


'Programming > Java' 카테고리의 다른 글

[Java-11]오버로딩(feat.디폴트 생성자)  (0) 2017.10.04
[Java-10]생성자와 this  (0) 2017.10.01
[Java-08]배열  (0) 2017.09.30
[Java-07]반복문  (0) 2017.09.29
[Java-06]switch(스위치)  (0) 2017.09.29

+ Recent posts