[JAVA] 객체지향 개념

Posted by 신희준 on August 22, 2017
<meta name="facebook:title" content="자바 배열">
<meta name="facebook:description" content="자바의 정석책을 참고하여 요약한 JAVA 객체지향 개념">
<meta name="facebook:domain" content="http://shj7242.github.io/2017/08/22/JAVA3/">

</head>


2017 - 08 - 22 (화)

  • 객체지향 언어
  • 클래스와 객체
  • 변수와 메서드
  • 생성자

  • 참고 도서 : 자바의 정석(남궁성 저, 도우출판)


    1 . 객체 지향 언어


    객체지향 언어의 장점

    ▶ 코드의 재사용성이 높다.

    ▶ 새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다.

    ▶ 코드의 관리가 용이하다.

    ▶ 코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.

    ▶ 신뢰성이 높은 프로그래밍을 가능하게 한다.

    ▶ 제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다.

    1 . 클래스와 객체


    클래스 : 객체를 정의해 놓은 것이며 객체를 생성하는데 사용된다.
    객체 : 클래스에의해 정의되며 같은 클래스에 의해 정의된 객체는 같은 속성들을 가지고 있다.

    클래스는 변수와 메서드로 구성되어 있으며 이 클래스의 객체를 생성하여 변수와 메서드를 사용할 수 있다.

    2 . 변수와 메서드


    선언 위치에 따른 변수의 종류와 범위

    class test{
    int iv;  // 전역 변수 (인스턴스 변수) -- 인스턴스가 생성될 때 생성된다.
    static int cv; //클래스 변수 -- 클래스가 메모리에 올라갈 때 생성된다.
      void method(){
        int lv = 0; // 지역변수 -- 변수 선언문 수행시 생성된다. 즉, 메서드가 실행되야함.
      }
    }
    


    인스턴스 변수 : 객체생성시 참조변수(객체명).인스턴스변수로 접근한다. 참조변수가 없을 때 가비지 컬렉터에 의해 자동제거됨

    클래스 변수 : 클래스명.클래스변수명 으로 접근가능하다. 같은 클래스의 모든 인스턴스들이 공유하는 변수이다.

    지역변수 : 메서드 내에 선언되어 메소드 종료와 함께 소멸된다. for문이나 if 문등 반복/제어문 안에서 생성된 변수는 블록이 종료되는 시점에 소멸한다.

    * 인스턴스 변수는 인스턴스가 생성될 떄마다 생성되므로 인스턴스마다 각각 다른 값을 유지할 수 있지만 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 가진다.

    메서드 : 작업을 수행하기 위한 명령문의 집합

    void method(){ System.out.println("abc"); } //반환타입이 없을 때 void 를 사용한다. abc라는 문장을 시스템에 출력하는 메소드
    String method(){
      String a = "abc";
      return a;
    }// 반환타입이 String이면 String값을 반환해야한다. 즉, 반환타입이 int 일 경우 int 를 반환해야함.
    
    
    Student method(){
        String id = "heejun";
        String pw = "1234";
        Student student = new Student(id, pw);
        return student;
    }// 객체 타입으로 반환할 수도 있다.
    
    
    String method(Student student){
        String id = student.getId();
        return id;
    }// 매개변수를 받는다. 위의 경우 매개변수를 Student형태의 student객체를 받아와 이 객체의 Id값을 가져와 lv에 넣어 이 lv 를 반환한다.
    



    메서드의 종류

    클래스 메서드(static이 붙어있는 메서드) : 인스턴스와 관계없는(인스턴스 변수나 인스턴스 메서드를 사용하지 않는) 메서드. 객체를 생성하지 않고 클래스이름.메서드이름(매개변수)으로 호출 가능. 그러나 클래스 변수가 호출되었을 때 인스턴스가 생성되어있지 않았을 수도 있으므로 클래스 변수는 인스턴스 메서드를 호출하는 것을 금지해 놓았다.

    인스턴스 메서드(static이 없는 메서드) : 인스턴스 변수와 관련된 작업을 하는, 즉 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드. 객체를 생성해야만 호출 가능. 인스턴스 메서드 안에서 인스턴스 메서드 및 클래스 메서드를 호출 할 수 있다.


    JVM의 메모리 구조

    Post Sample Image


    메서드 영역 : 클래스 정보와 클래스 변수가 저장되는 곳이다.

    호출 스택 : 메서드의 작업공간으로 메서드가 호출되면 메서드 수행에 필요한 메모리 공간을 할당받고 메서드가 종료되면 사용하던 메모리를 반환한다.

    힙 영역 : 인스턴스가 생성되는 공간. new 연산자에의해서 생성되는 배열과 객체는 모두 이 곳에 생성된다.


    Post Sample Image

    CallStack 은 하나의 프로세스 내에서 생성된다. 예를들어 main문이 실행되고 이어서 다른 메소드가 호출되면 먼저 실행된 메소드의 수행을 멈추고 다음 메소드를 수행한다. 이렇게 Stack형태로 쌓이며 메소드의 수행을 완료하면 소멸한다. CallStack하나는 한개의 쓰레드라고 할 수 있다.



    재귀호출 : 메서드 내에서 자기자신을 반복적으로 호출하는 것. 이해하기 쉽고 간결한 코드를 작성할 수 있다.


    int factorial(int n){
      int result = 0;
      if(n==0){
        result = 1;
      }else{
        result = n * factorial(n-1);
      }  
    }
    
    /*
    int factorial(int n){
      result = 1;
      for(int i = n ; i=>0; i--){
        result*=n;
    }
    return result;
    }
    */
    //본래 위와 같이 for문을 활용하여 factorial 메소드를 구현하였다. 위 방법 외에 재귀호출을 이용하여 간결한 코드로 factorial 메소드를 구현한다. 코드는 간결하나 사실상 메소드를 계속 호출하므로 성능은 더 좋지 않다.
    


    메서드 오버로딩 : 하나의 클래스에 같은 이름의 메서드를 여러개 정의하는 것을 메서드 오버로딩 이라고 한다. 매개변수를 달리하여 같은 이름의 메소드를 여러개 사용한다. ex) println 메소드

    오버로딩의 조건

    - 메서드의 이름이 같아야 함.
    - 메개변수의 개수 또는 타입이 달라야 함.
    - 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.

    3 . 생성자


    생성자 : 인스턴스가 생성될 때마다 호출되는 '인스턴스 초기화 메소드'이다.
    * 모든 클래스에는 하나 이상의 생성자가 있어야한다.

    this() , this : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.

    class Card{
      int num;
      String kind;
      Card(){
        this(9, "diamond"); // Card(int num, String kind) 생성자를 호출함.
      } // 기본생성자 (default) 생성자
      Card(int num, String kind){
        this.num = num;  // this는 해당 클래스의 인스턴스 변수를 카리킨다.
        this.kind = kind;
      }// 매개변수가 있는 생성자
    }
    


    객체 지향 개념 쉽게 이해하기

    class Tv{
      String color; // 인스턴스 변수 생성 및 자동초기화
      int channel
    
      Tv(String color , int channel){
        this.color = color;
        this.channel = channel;
      } // 매개변수가 있는 생성자.
    
      Tv(){} // default 생성자
    
      void channelUp(){
        channel++
      }
      void channelDown(){
        channel--
      } // 메서드생성
    }
    class TvTest{
      public static void main(String args[]){
        Tv t = new Tv();
        Tv t1 = new Tv("red", 45); // 빨간색의 45번 채널이 틀어져있는 t1 이라는 Tv생성
        t.color = "blue";
        t.channel = 30; // t라는 Tv의 인스턴스 생성 및 t객체의 color 속성과 channel 속성에 blue, 30 값을 넣어줌
    
        t.channelDown(); // t객체의 channel 값이 29로 내려감
        t1.channelUp(); // t객체의 channel 값이 46으로 올라감.
    
      }
    }