Media Log


1. 객체(Object)


클래스를 배우기 전 객체(Object)가 무엇인지 알아둘 필요가 있습니다. 우리가 알고있듯이 자바는 객체 지향 프로그래밍(액션스크립트, 스몰토크, 파이썬, 델파이, C#, C++, 자바, VB.NET'등이 있습니다.)


여기서 Object는 사전적 의미 그대로 '물건, 물체'를 의미합니다. 예를 들어, 나 또한 객체가 되고 그 주위에 있는 키보드, 마우스, 모니터, 책, 지갑, 달력 등등 모든것이 객체가 됩니다. 이해를 돕기위해 오토바이에 대해 추상화를 해봅시다. 오토바이의 구조를 살펴보면 바퀴, 의자, 연료탱크, 브레이크 페달, 기어 변속기 등으로 구성되어 있습니다.  그리고 오토바이를 타면서 속도를 내거나, 속도를 줄이거나 할 수도 있습니다. 정리해보면 이렇습니다.


오토바이의 속성: 바퀴, 의자, 연료탱크, 브레이크 페달, 기어 변속기 등

오토바이의 행동: 속도를 낸다, 속도를 줄인다, 경적을 울린다 등


여기서 오토바이라는 이름은 하나의 객체(Object)이며, 바퀴, 의자, 기어변속기, 브레이크 페달처럼 객체가 지니고 있는 특성 또는 속성은 상태(state)를 의미하고, 속도를 낸다, 속도를 줄인다, 경적을 울린다 등은 객체가 할 수 있는 행동(behavior)를 말합니다. 정리하자면, 객체는 상태(특성, 속성)와 행동(동작)로 이루어져 있다고 보시면 됩니다.


이제 객체 지향 프로그래밍이 무엇인지 대충 감이 잡히시죠? 객체가 단위가 되는 객체 지향 프로그래밍은 현실 세계에 존재하는 객체를 컴퓨터 상에서 표현하는 것으로 객체가 갖는 상태와 행동을 프로그래밍에서의 인스턴스 변수와, 메소드로 모델링합니다. 이 객체 지향 프로그래밍 언어가 갖는 특징은 크게 추상화(Abstraction), 상속성(Inheritance), 캡슐화(Encapsulation), 다형성(Polymorphism), 동적 바인딩(Dynamic Binding)가 있습니다. 아직은 그냥 '~ 이러이러 한것이 있다'라고만 기억해두시면 됩니다. 자바를 배우게 되면서 자연스레 접하게 될것들이니까요.


2. 클래스 (Class)


그렇다면 클래스(Class)는 무엇일까요? 클래스란 바로 공통된 특징을 가지고 있는 객체들의 모임입니다. 아까 말했듯이 객체가 '물건, 물체'라면 클래스는 '틀, 설계도'를 의미합니다. 만약에 우리가 객체(물체)를 생성하려면, 그전에 클래스(틀)를 만들어야겠죠? 


설명은 잠시 접어두고, 위에서 예로 든 오토바이 클래스를 직접 구현해봅시다.


class Vehicle {

    private int speed = 0; // 현재 속도를 나타내는 필드

    private int maxSpeed = 100; // 최대 속도를 나타내는 필드


    public int showSpeed() // 현재 속도를 보여준다

    {

        return speed;

    }


    public int showMaxSpeed() // 최대 속도를 보여준다

    {

        return maxSpeed;

    }


    public void speedUp(int increment) // 속도를 낸다

    {

        if(speed + increment > maxSpeed){

            System.out.println("최대 속도 " + maxSpeed + "km/h를 넘어설 수 없습니다.");

        }else{

            speed += increment;

        }

    }


    public void speedDown(int decrement) // 속도를 줄인다

    {

        if(speed - decrement < 0){

            System.out.println("속도는 0 아래로 떨어질 수 없습니다.");

        }else{

            speed -= decrement;

        }

    }

}


위의 Vehicle 클래스를 살펴보면 두개의 변수 speed, maxSpeed가 선언되어 있고, 네개의 메소드 showSpeed(), showMaxSpeed(), speedUp(), speedDown()이 정의되어 있습니다. 여기서 객체는 상태와 행동의 집합이라고 했었죠? 이 객체가 지니고 있는 상태와 행동을 그 객체의 멤버(member)라고 합니다. 상태는 멤버 변수, 특성, 속성, 필드와 같은 말이며 행동은 메소드, 함수와 같은 말입니다.


그런데, 위의 Vehicle 클래스를 가지고는 아무런 기능을 못합니다. 만약 컴파일 한다면 아래의 오류를 보실 수 있습니다.


오류: Vehicle 클래스에서 기본 메소드를 찾을 수 없습니다. 다음 형식으로 기본 메소

드를 정의하십시오.

   public static void main(String[] args)


메인 메소드가 없기 때문에 발생하는 오류입니다. 


위의 예제에 메인 메소드를 넣고, 객체를 어떻게 생성하고 접근하는지 그 방법을 알아봅시다.


class Vehicle {

    private int speed = 0; // 현재 속도를 나타내는 필드

    private int maxSpeed = 100; // 최대 속도를 나타내는 필드


    public int showSpeed() // 현재 속도를 보여준다

    {

        return speed;

    }


    public int showMaxSpeed() // 최대 속도를 보여준다

    {

        return maxSpeed;

    }


    public void speedUp(int increment) // 속도를 낸다

    {

        if(speed + increment > maxSpeed){

            System.out.println("최대 속도 " + maxSpeed + "km/h를 넘어설 수 없습니다.");

        }else{

            speed += increment;

        }

    }


    public void speedDown(int decrement) // 속도를 줄인다

    {

        if(speed - decrement < 0){

            System.out.println("속도는 0 아래로 떨어질 수 없습니다.");

        }else{

            speed -= decrement;

        }

    }

}


class VehicleMain {

    public static void main(String[] args) {

        Vehicle bike = new Vehicle();


        bike.speedUp(10);

        System.out.println("현재 오토바이의 속도: " + bike.showSpeed() + "km/h");

        bike.speedUp(50);

        System.out.println("현재 오토바이의 속도: " + bike.showSpeed() + "km/h");

        bike.speedUp(60);

        System.out.println("현재 오토바이의 속도: " + bike.showSpeed() + "km/h");

bike.speedDown(40);

System.out.println("현재 오토바이의 속도: " + bike.showSpeed() + "km/h");

    }

}


결과(java VehicleMain):

현재 오토바이의 속도: 10km/h

현재 오토바이의 속도: 60km/h

최대 속도 100km/h를 넘어설 수 없습니다.

현재 오토바이의 속도: 60km/h

현재 오토바이의 속도: 20km/h

(컴파일 시 클래스 파일 Vehicle.class, VehicleMain.class 둘 다 생성됩니다.)


34행 위의 내용은 이미 설명했으므로, 아래의 내용을 다루도록 하겠습니다. 먼저 코드에서 36행을 보세요. 여태까지 자료형이 오던 자리에 Vehicle이 오고, new 라는 새로운 키워드가 등장했죠? 이 new 키워드는 객체를 생성해주는 역할을 합니다. 객체를 왜 생성하냐구요? 맨 위의 Vehicle 클래스는 틀에 불과합니다. 틀만 가지고는 아무것도 할 수 없기때문에 틀을 이용해 객체를 찍어내야 합니다. 


new 키워드를 이용한 객체 생성 방법:

클래스명 변수명 = new 클래스명();


즉, new 키워드를 이용해서 Vehicle 객체를 만들고 bike라는 이름의 변수로 Vehicle 객체를 참조한다는 말과 같습니다. 그래서 36행에 쓰인 bike는 '참조 변수'라 합니다.


이제 다시, 38행을 봅시다. 38행에는 bike가 참조하는 Vehicle 객체의 speedUp 메소드를 호출하고 있습니다. 


38: bike.speedUp(10);

(. 연산자를 통해 객체의 변수 혹은 메소드에 접근할 수 있음을 나타냅니다.)


메소드 speedUp은 speed의 값을 메소드로 넘겨준 increment 만큼 증가시키는 역할을 하고 있으므로, 10이 적혔으니 speed의 값은 10이 증가합니다. 39행은 bike가 참조하는 Vehicle 객체의 showSpeed 메소드를 호출하는 것으로

showSpeed 메소드는 speed의 값을 반환하는 기능을 하므로 현재 speed의 값 10이 반환되어 10km/h라 출력됩니다. 40~41행은 마찬가지고, 42행의 문장이 실행되기 전 speed의 값이 60이므로 50을 증가시켰다간 110이 되어 최대 속도를 벗어나서 증가가 무시됩니다. 44행은 speedDown 메소드를 호출하여 현재 speed에서 40을 감소시킵니다.


클래스에 대해 이해가 되셨나요? 처음 프로그래밍 언어를 접하시는 분들은 다소 헷갈릴 수도 있습니다. 만약 헷갈리신다면 아래의 덧글에 무엇이 이해가 안되시는지를 적어주시면 설명에 보충설명을 달아드리도록 하겠습니다.


수고하셨습니다. 다음 강좌에서는 생성자(Constructor)에 대해 배워보도록 하겠습니다.


  1. 이전 댓글 더보기
  2. seon namkung at 2014.01.22 18:44 신고 [edit/del]

    class를 두개 만들어야 하는 이유는 무엇인가요?
    하나로는 안되는 건가요?

    Reply
    • BlogIcon EXYNOA at 2014.01.31 13:44 신고 [edit/del]

      물론 VehicleMain의 기능이 Vehicle 클래스 내에 존재하여도 됩니다. 제가 저렇게 작성한 이유는 확실한 구분을 위해서 클래스를 분리하여 둔 것이지, 다른 의미는 없었습니다.

  3. ㅇ ㅅㅇ at 2014.02.12 06:44 신고 [edit/del]

    여기서 클래스가 c언어의 구조체랑 비슷한건가요?

    Reply
  4. MK at 2014.03.10 11:43 신고 [edit/del]

    이해가 정말 잘되게 설명을 잘 해놓으셔서 너무나 많은 도움이 됩니다.
    좋은 강좌 많이 보고 배우고 갑니다... 감사합니다.
    한가지 질문으로

    10의 숫자가 int 형의 increnemt 로 들어감
    bike.speedUp(10) -> speedUp(int increment) 이렇게 이해 하면되는것인지요?

    Reply
  5. :) at 2014.04.09 14:35 신고 [edit/del]

    너무 깔끔하게 잘 정리 해놓으셔서 시험 치기전에 보는데 너무너무 도움되네요:)
    감사합니다!

    Reply
  6. BlogIcon ThatO at 2014.05.24 14:08 신고 [edit/del]

    그런데 클래스명도 변수명처럼 자료형같은 것을 쓰면 안되나요?

    Reply
  7. 만수 at 2014.06.09 18:36 신고 [edit/del]

    이렇게 좋은 강좌를 공유해주시니 정말 감사합니다 복받으세요

    Reply
  8. at 2014.07.15 16:49 신고 [edit/del]

    저는 소스는 맞게 작성한거같고 컴파일에러도 없는데 오류가 뜨네요..
    오류: Vehicle 클래스에서 기본 메소드를 찾을수 없습니다. 다음 형식으로 기본 메소드를 정의하십시오.
    Public static void main(String[] args)
    또는 JavaFX 응용 프로그램 클래스는 javafx.application.Application을(를) 확장해야 합니다.
    계속하려면 아무 키나 누르십시오...

    이렇게 뜨네요.. 왜 그런걸까요?ㅠㅠ

    Reply
    • BlogIcon EXYNOA at 2014.07.20 11:00 신고 [edit/del]

      프로젝트를 만드실 때 JavaFX Application 프로젝트를 만드신 건 아닌지 체크해보세요. import된 클래스 중에 javafx로 시작하는 클래스가 있는지 검토해보시고, 설치된 자바 버전도 함께 검토해 보시는게 좋을듯 싶습니다.

    • 엔터군 at 2016.11.17 21:28 신고 [edit/del]

      저와 같은 현상을 격으셨는데요..
      본문을 자세히 읽어보니 나와있었습니다....
      java Vehicle 이 아닌
      java VehicleMain 으로 실행시켜야합니다.

    • 손강 at 2017.04.19 18:02 신고 [edit/del]

      자바는 main메서드가 있는 클래스가 시작입니다.
      그래서 main메서드는 오직 1개만 존재해야하고
      여러개가 있을 경우 오류가 발생합니다.

  9. Anthony Hong at 2014.08.05 18:26 신고 [edit/del]

    하나의 패키지 안에 2개의 자바 파일이 있습니다. 하나는 메인 메서드를 가지고 있고, 다른 하나는 단순히 기능들만 가진 메서드들을 가지고 있습니다. 여기서 메인 메서드를 가진 파일이 다른 하나의 자바파일을 참고하고 싶을 때 어떤 기능을 써야 할까요?

    Reply
  10. Lim Sehjoon at 2014.08.26 13:29 신고 [edit/del]

    이제까지 강좌 정말 도움되고 있네요ㅎ 감사합니다.

    한가지 여쭤볼게...처음 파일을 생성하면 처음 1행에
    public class 클래스명
    이 생기게 되는데, 무시하고 임의로 클래스명을 쓰면 되는건가요?

    그리고

    Vehicle bike = new Vehicle(); 가 뜻하는게...

    Vehicle에 포함되어 있는 코드들을 bike으로 치환함으로써,

    VehicleMain 클래스 안에 코드들에서 Vehicle 클래스 안에 코드들을 활용할 수 있도록 하는 건가요?

    (쓰는 저도 말이 어렵네요///)

    항상 감사합니다ㅎ

    Reply
    • BlogIcon EXYNOA at 2016.01.02 12:56 신고 [edit/del]

      클래스명과 파일명은 동일하게 작성해주셔야 합니다. 이 부분에 대해서 추가적으로 궁금한 사항이 있으시면 더 자세히 설명해드리도록 하겠습니다. 그리고 말씀해주신 '코드를 변수명으로 치환한다'라는 개념은 적절하지는 않습니다. (예를 들어서, 흔히 드는 예시지만 Vehicle이 붕어빵 틀이라고 생각한다면 bike는 붕어빵 틀을 통해 찍혀서 나온 붕어빵과 동일합니다.)

    • 손강 at 2017.04.19 18:04 신고 [edit/del]

      클래스 이름을 동일하게 .java파일로 저장해야 합니다.
      저장된 이름과 클래스 이름이 다르면 인식이 안됩니다.
      한 파일안에 여러 클래스가 있을 경우
      main메서드가 있는 클래스 이름으로
      저장해야 합니다.

  11. 차녕 at 2014.09.14 01:44 신고 [edit/del]

    public class asdf {
    public int multiply(int a, int b) {
    return a *b;
    }
    }
    class Thisistime {
    public static void main(String[] args) {
    asdf result1 = new asdf();
    asdf result2 = new asdf();
    System.out.println(result1.multiply(4,5) + result2.multiply(3,4));
    }
    }

    간단하게 만들어봤는데 기본 main method를 정의하라고 뜨네요... 이미 public static void main 이 되어잇는데 왜 이럴까요 ...

    Reply
    • BlogIcon EXYNOA at 2016.01.02 12:57 신고 [edit/del]

      Thisistime 클래스 앞에 public 키워드를 추가시키고 asdf 클래스 앞의 키워드를 제거하시기 바랍니다. 그리고 기본적으로 public가 따라붙은 클래스의 이름과 파일의 이름은 동일해야만 합니다.

  12. 김민정 at 2014.09.30 18:52 신고 [edit/del]

    에디트 플러스에서 작업을 했습니다.

    /* error

    오류: Vehicle 클래스에서 기본 메소드를 찾을 수 없습니다. 다음 형식으로 기본 메소드를 정의하십시오.
    public static void main(String[] args)
    또는 JavaFX 응용 프로그램 클래스는 javafx.application.Application을(를) 확장해야 합니다.

    */

    이렇게 나오고 있습니다.
    왜 그러는 것일까요?

    Reply
    • BlogIcon EXYNOA at 2016.01.02 12:59 신고 [edit/del]

      윗분과 같은 문제이지는 않은지 한번 확인해보시기 바랍니다. 기본 메소드와 관련된 에러는 정말 main 메소드가 존재하지 않거나, public 키워드와 관련된 문제일 가능성이 높습니다.

  13. 강민희 at 2014.09.30 23:48 신고 [edit/del]

    가장 마지막에 예시로 들어주신 코드에서
    어떤 것이 객체이고 어떤 것이 클래스인지 헷갈립니다.

    vehicle 이라는 class를 만들었고,
    bike라는 이름의 같은 기능을 하는 class를 만들어서
    사용했다...

    라고 이해했는데 설명에는
    bike가 객체라고 되어 있는것 같네요... ㅠㅠㅠ 으익 헷갈립니다..

    Reply
    • BlogIcon EXYNOA at 2016.01.02 13:02 신고 [edit/del]

      bike는 객체이며 Vehicle는 클래스입니다. 다른 강좌 게시글에서 작성했던 내용이지만

      '붕어빵이라는 객체를 만들기 위해서는 붕어빵을 찍어낼 틀이 필요합니다. 여기서 붕어빵을 찍어낼 틀은 클래스라고 할 수 있습니다. 붕어빵 틀(클래스)은 하나만 있어도 붕어빵(객체)를 여러개 찍어낼 수 있죠.'

      즉, Vehicle는 붕어빵을 찍어내는 틀에 불과하며 bike는 Vehicle라는 붕어빵 틀로 찍혀서 만들어진 붕어빵(객체)과 같다고 말할 수 있습니다. 쉽게 이해하실 수 있도록, 오해의 소지가 다분한 내용에 대해서는 좀 더 수정을 거치도록 하겠습니다.

  14. 고니 at 2015.01.21 00:23 신고 [edit/del]

    개인적으로 속성(?)으로 자바를 공부하고 있는 사람입니다.
    강좌가 너무 깔끔하게 정리되어 있고, 적절한 예제와 코드 설명 너무 감사합니다~!

    궁금한 것이 있어서 질문드려요~! ^^;
    최대 속도를 확인하는 if문에서 출력되는 문장을 아래와 같이 변경해도 괜찮은거죠!?
    System.out.println("최대 속도 " + showMaxSpeed() + "km/h를 넘어설 수 없습니다.");
    위와 같이 maxSpeed 대신 showMaxSpeed() 메소드를 넣어봤습니다^^;;

    아! 그리고... 게시글 금칙어가 뭔지 한~참 찾았답니다~! ㅋㅋㅋ (개인사.정으로...)

    Reply
    • BlogIcon EXYNOA at 2016.01.02 13:04 신고 [edit/del]

      물론 가능합니다.

      P.S. 저도 금칙어와 관련된 문제로 어느게 금칙어인지 몰라서 헤맸던 적이 많습니다<< 기본적으로 티스토리 내에서 금칙어 리스트가 올라간 것으로 보입니다.

  15. 공부중 at 2015.03.25 21:01 신고 [edit/del]

    기본메소드를 찾을 수 없다고 오류 뜨시는분들
    자바 파일 (.java) 의 이름을 VehicleMain.java로 만들어 주셔야 실행됩니다!!

    Reply
  16. 못해먹을java at 2015.05.09 18:14 신고 [edit/del]

    java를 포기해야겠어요 너무 어려움

    Reply
  17. java를 하자 at 2015.05.10 09:21 신고 [edit/del]

    매소드 두개 쓸 수 있나요?

    Reply
  18. EXYNOA FAN at 2015.12.31 16:53 신고 [edit/del]

    직접적 오류가 없는 상황에서 실행 결과 이렇게 나옵니다
    오류: 기본 클래스 반환을(를) 찾거나 로드할 수 없습니다.
    이럴 경우에는 어떻하나요????

    Reply
    • BlogIcon EXYNOA at 2016.01.02 13:07 신고 [edit/del]

      환경변수와 관련된 문제일 가능성이 높습니다. 만약 정상적으로 환경변수가 등록되어 있는데도 불구하고 동일한 오류가 발생하신다면, 작성하신 코드와 그 파일명(확장자 포함)을 함께 올려주시기 바랍니다.

  19. yangyang at 2016.04.05 20:14 신고 [edit/del]

    이클립스로 실행하려고 하는데 F11을 누르면 the selection cannot bd launched, and there are no recent launches.라고 나오는데 이게 무슨 오류인가요?

    Reply
  20. asd at 2016.07.09 11:18 신고 [edit/del]

    분할컴파일?

    Reply
  21. at 2016.07.22 17:27 [edit/del]

    비밀댓글입니다

    Reply

submit

티스토리 툴바