ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 6. 자바 오브젝트와 클래스 (1) built-in 오브젝트
    자바(Java) 강의 2019. 3. 26. 16:37

    지금까지 우리는 자바의 기본 자료형, 배열, 조건문과 반복문, 그리고 메서드에 대해 알아보았다. 자바든 다른 언어든 기본 자료형, 배열, 반복문, 메서드(함수)를 알면 어떤 코드든 작성 하고 돌릴 수 있다. 이들은 프로그램을 만들기 위한 기본적인 문법들이다. 대부분의 프로그래밍 언어들은 이와 같은 기본적인 문법을 제공한다.

    이번 포스트부터 나오는 것들은 자바가 소프트웨어 엔지니어들이 개발 하기 쉽도록 도와주기 위해 만든 어떤 특별한 문법에 대한 이야기이다. 더 자세히 말하자면, 프로그래머들이 가독성이 좋고, 확장(수정 및 기능 덧붙이기) 가능하고, 유지 보수가 쉬운 코드를 짤 수 있게 하는 문법에 대한 이야기이다. 자바와 비슷하게 이런 특별한 문법을 제공하는 언어들을 컴퓨터의 세계에서는 '객체 지향 프로그래밍 언어(Object Oriented Programming Language)'이라고 부르고, 이런 특별한 문법을 이용해 소프트웨어를 디자인 하는 것을 '객체 지향 디자인(Object Oriented Design)'이라고 한다. 또 이 포스트에서 말하는 특별한 문법을 이용하지 않고 소프트웨어를 디자인 하는 것을 '절차 지향 디자인(Procedural Design)'이라고 부른다(객체 지향의 반대 개념). 이 포스트에서는 그 특별한 문법 중 첫번째로, 오브젝트에 대해 이야기하도록 한다. 오브젝트는 딱히 자바 언어만의 개념은 아니지만 오브젝트를 만들기 위해서 자바가 제공하는 특별한 문법을 사용해야 하므로 다른 문법보다 오브젝트에 대해 먼저 설명하려고 한다.

    참고!

    • 어떤 코드가 가독성이 좋다는 것은? - 예를들어 읽으면서 코드가 무슨 기능을 하는지 한번에 알 수 있으면 가독성이 좋은 것이다.
    • 어떤 코드가 확장 가능하다는 것은?- 예를들어 어떤 기능 추가를 위해 코드를 덧붙여야 할 때 기존 코드부분의 수정 없이 내 코드만 갖다 붙였는데 동작하면 확장성이 좋은 것이다.
    • 어떤 코드가 유지 보수가 쉽다는 것은? - 예를들어 어떤 기능을 고치려고 코드를 수정했는데 뜬금없이 다른 부분의 코드가 고장 나거나, 작은 버그 하나를 고치려는데 여기저기 50군데를 수정 해야 하는 경우 유지 보수가 힘든 것이다.

    예상 독자

    • 오브젝트 (Object)
    • String 오브젝트
    • 배열 오브젝트

    오브젝트 (Object)

    오브젝트는 왜 만들었는가? 세상에 기본 자료형과 개개의 메서드로 표현하기에는 가독성이 떨어지고, 기능 확장이 힘들고, 유지보수가 힘든 것들이 있다. 특히 어떤 하나의 물건을 표현하기 위해서 여러개의 기본 자료형이 필요 할 때가 있다. 예를들어 학생이라는 것은 수학성적(int), 영어성적(int), 국어성적(int)등이 있을 수 있다. 학생이라는 하나의 무언가을 표현하기 위해 여러개의 기본 자료형(primitive data type)이 필요하다는 뜻이다. 따라서 우리는 이런 학생의 특성/속성과 기능을 모아서 하나의 자료구조로 만든다. 기능의 예로는 학생의 성적 평균값을 구하는 것이 있다. 이런 자료구조를 실제로 코드 내에서 생성 한 것이 바로 오브젝트이다.

    오브젝트는 속성(Attributes)과 기능(Function)로 구성된다. 구체적으로 속성이란 변수(데이터)를 의미하고 기능은 메서드(Method)를 의미한다. 즉 오브젝트는 0개 이상의 변수와 0개 이상의 메서드를 가지고 있다. 이렇게 말해도 잘 와 닿지 않을테니 자바에서 기본적으로 제공하는 built-in 오브젝트를 보며 이해해보자.

    참고!  속성/기능은 추상적인 개념이다. 자바에서 속성은 변수로 표현되고, 기능은 메서드로 표현된다는 점을 유의하자.

    String 오브젝트

    public class Main {
    public static void main(String[] args) {
    new String("나의 첫 오브젝트");
    }
    }

    자바에서 오브젝트는 위 처럼 new라는 키워드를 이용해 생성한다. new다음에는 오브젝트의 자료(구조)형(Data Type)을 적는다. 위 오브젝트의 자료(구조)형(Data Type)은.... String이다! 여기서 말하는 자료(구조)형을 기본 자료형(primitive data type)과 헷갈리지 말자. 자바의 기본 자료형은 new를 이용해 생성하지 않는다. 

    이 오브젝트에 우리는 괄호 안에 "나의 첫 오브젝트"라는 값(속성(Attribute) 을 주었다. 보통은 오브젝트를 생성하기 위해서는 이렇게 'new 오브젝트의_자료구조형_이름()' 이렇게 적어주고 괄호 안에는 초기값을 적어준다. 초기값은 필요 할 수도 있고 필요 없을 수도 있다.

    오브젝트는 속성(변수)과 기능(메서드)로 구성된다고 했다. 이 오브젝트의 메서드를 이용 할 수 있을까? 인텔리제이나 이클립스에서 마침표(.)를 누르면 이 오브젝트의 변수와 사용 할 수 있는 메서드의 목록이 나온다. (String 오브젝트는 아쉽게도 현재 우리가 사용 할 수 있는 변수는 없어 보인다.)

    예를들어 리스트의 네번째에서 [length()          int]를 보자. 얘의 메서드이름은 length이고 매개변수는 받지 않는다. 그리고 맨 오른쪽에 나오는 것은 이 메서드의 리턴 값이다. 이 메서드는 int를 리턴 하는 것을 알 수 있다. 메서드의 이름으로 유추 해 보면 길이를 리턴 하는 것 같다. 무엇의 길이를 리턴하는가? 이 오브젝트에 들어있는 속성 - 즉 "나의 첫 오브젝트"의 길이를 리턴한다는 뜻이다.

    확인해보자.

    public class Main {
    public static void main(String[] args) {
    int len = new String("나의 첫 오브젝트").length();
    System.out.println(len);
    }
    }
    실행 결과: 9

     그렇다면 오브젝트 자체를 변수에 담을 수 있을까? 당연히 있다. 위에서 new다음에는 이 오브젝트의 자료(구조)형을 적어준다고 했다. 기본 자료형(primitive data type)이든 그냥 자료(구조)형(data type)이든 변수를 선언하기 위해서는 해당 변수가 어떤 데이터를 표현할지 적어줘야 한다. 따라서 String형의 오브젝트를 저장 할 변수는 아래처럼 선언 할 수 있다.

    public class Main {
    public static void main(String[] args) {
    String str;
    }
    }

    위는 str이라는 변수에 String형의 오브젝트를 집어넣을 수 있음(할당)을 의미한다. 그렇다면 실제로 String이라는 형의 오브젝트를 생성하고 str에 집어넣으려면(할당하려면) 어떻게 해야하는가? 그렇다 아까 배운 것 처럼 new String("문자열..");하고 생성 해 준 후 '='를 이용해 str에 할당하면 된다.

    public class Main {
    public static void main(String[] args) {
    String str = new String("Hello World!");
    System.out.println(str);
    }
    }
    실행 결과: Hello World!

    이제 str은 "Hello World!"를 값으로 갖고있는 String형의 오브젝트를 가지고 있다. 해당 오브젝트의 메서드에도 접근 해 보자.

    public class Main {
    public static void main(String[] args) {
    String str = new String("Hello World!");
    System.out.println(str.length());
    }
    }
    실행 결과: 12

    "Hello World!"의 길이를 출력했다.

    연습문제

    • String 오브젝트를 만들고 equalsIgnoreCase라는 메서드를 이용해보아라. 이 메서드는 무엇을 매개변수로 받는가? 무엇을 리턴하는가? 어떤 기능을 할 것 같은가? 
    • String 오브젝트의 메서드들을 보고 각각이 어떤 매개변수를 받는지, 어떤 자료구조/형(primitive data type/data type)을 리턴하는지 알아보자. 또 각각 어떤 기능을 하는지 알아보자.

    배열 오브젝트

    배열을 했던 포스트에서 배열은 자료형이 아니고 자료구조라고 했던 것이 기억나는가? 자료형이 아니므로 지금까지 배웠던 자료형 선언 및 초기화 방법과는 다르다고 했었다. 그 때 우리가 생성 한 것은 무엇이었나? 그렇다. 배열 오브젝트였다!

    public class Main {
    public static void main(String[] args) {
    int[] array = new int[3];
    }
    }

    배열은 어떻게 선언하고 초기화했는가? 특히 초기화부분을 보라. new하고 배열 '오브젝트'를 생성했다. 비록 ()로 초기화 하진 않지만 배열의 길이를 넣어주고, 또 { }를 이용해 배열 오브젝트를 초기화 할 수 있었다.

    이제 이 배열 오브젝트에는 어떤 변수/메서드가 있는지 확인 해 보자. length를 자세히 보니 괄호가 없다.. 무슨 뜻인가? length는 메서드가 아니라 변수(속성)라는 뜻이다. 그리고 이 length는 int 값을 가지고 있는 이 배열 오브젝트 안에 존재하는 변수이다. 이후에 나오는 clone, equals, hashcode등은 모두 메서드이다. 오브젝트이기 때문에 속성(attibute/data)와 기능(method)로 구성된다.

    기본 자료형(Primitive Data Type)

    이번엔 내가 거짓말을 하는건지 알아보기 위해 기본 자료형(Primitive Data Type)을 보자.

    이렇게 보니 여러가지 사용 할 수 있는 문법들이 보이지만 메서드의 형식으로 되어있는 건 없다. 또 리스트에 나온 것들 중 하나를 눌러보면 알겠지만, 얘네들은 속성이나 기능이 아니라 자동으로 문법을 만들어 주는 것이다. 따라서 기본 자료형은 값 1개만 있고, 기능(메서드)는 없다.

    이번 포스트를 통해 자바의 built-in 오브젝트에 대해 알아보았다. 지금 단계에서는 오브젝트의 개념이 헷갈릴 수 있다. 특히 클래스에대해 알고 있다면 오브젝트와 클래스의 차이점에 대해 헷갈릴 수 있다. 아래의 것들을 확실히 이해하고 넘어가자.

    • 오브젝트는 속성(변수)과 기능(메서드)로 구성된다. (:= 오브젝트는 변수와 메서드를 가지고 있다.)
    • 오브젝트는 new 키워드를 이용해 생성한다.
    • 오브젝트는 '생성'되지 않으면 사용 할 수 없다.
    • 생성된 오브젝트 바로 옆에 마침표(.)를 찍으면 해당 오브젝트가 제공하는 속성과 기능(변수와 메서드)를 볼 수 있다. (접근 할 수 있다.)

    다음 포스트에서는 자바의 built-in 오브젝트가 아닌 나만의(?) 오브젝트를 만들기 위해 어떻게 해야 하는지 알아 보도록 하겠다.

    더 생각해보기

    System.out.println에서 println이 메서드라는 것은 이전 포스트에서 깨달았다. 그렇다면 System.out은 무슨 뜻일까?

    다음 포스트: 6. 자바 오브젝트와 클래스 (2) 클래스

    댓글

f.software engineer @ All Right Reserved