ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [whiteship] 온라인스터디 - 5주차. 클래스
    IT 발자취.../JAVA 2020. 12. 19. 18:53

    github.com/whiteship/live-study/issues/5

     

    5주차 과제: 클래스 · Issue #5 · whiteship/live-study

    목표 자바의 Class에 대해 학습하세요. 학습할 것 (필수) 클래스 정의하는 방법 객체 만드는 방법 (new 키워드 이해하기) 메소드 정의하는 방법 생성자 정의하는 방법 this 키워드 이해하기 마감일시

    github.com

    학습할 것 (필수)

    • 클래스 정의하는 방법
    • 객체 만드는 방법 (new 키워드 이해하기)
    • 메소드 정의하는 방법
    • 생성자 정의하는 방법
    • this 키워드 이해하기

    클래스 정의하는 방법 

    - 자바의 정석 3rd edition > chapter6. 객체지향 프로그래밍 > 클래스

    자바에서 클래스란 '객체를 정의해놓은 것' 또는 클래스는 '객체의 설계도 또는 툴'이라고 정의

    클래스는 객체를 생성하는데 사용되며, 객체는 클래스에 정의된 대로 생성된다.

    클래스의 정의 - 클래스란 객체를 정의해 놓은 것
    클래스의 용도 - 클래스는 객체를 생성하는데 사용
    객체의 사전적인 정의는, '실제로 존재하는 것'이다
    우리가 주변에서 볼 수 있는 책상, 의자, 자동차와 같은 사물들이 곧 객체이다. 객체지향이론에서는 사물과 같은 유형적인 것뿐만 아니라, 개념이나 논리와 같은 무형적인 것들도 객체로 간주한다.

    프로그래밍에서의 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다.

    객체의 정의 - 실제로 존재하는 것. 사물 또는 개념
    객체의 용도 - 객체가 가지고 있는 기능과 속성에 따라 다름

    유형의 객체 - 책상, 의자, 자동차, TV와 같은 사물
    무형의 객체 - 수학공식, 프로그램 에러와 같은 논리나 개념

    클래스와 객체의 관계는 우리가 살고있는 실생화에서 예를 들면, 제품 설계도와 제품의 관계라고 할 수 있다. 예를 들면, TV 설계도(클래스)는 TV라는 제품 (객체)을 정의한 것이며, TV(객체)를 만드는데 사용된다.

     

    또한 클래스는 단지 객체를 생성하는데 사용될 뿐, 객체 그 자체는 아니다. 우리가 원하는 기능의 객체를 사용하기 위해서는 먼저 클래스로부터 객체를 생성하는 과정이 선행되어야 한다.

     

    우리가 TV를 보기 위해서는, TV(객체)가 필요한 것이지 TV설계도(클래스)가 필요한 것은 아니며, TV설계도(클래스)는 단지 TV라는 제품(객체)를 만드는 데만 사용될 뿐이다. 그리고 TV 설계도를 통해 TV가 만들어진 후에야 사용할 수 있는 것이다.

    프로그래밍에서는 먼저 클래스를 작성한 다음, 클래스로부터 객체를 생성하여 사용한다.

     

    클래스는 관용적으로 대문자로 첫 단어를 선언한다.

    예 > Tv, Car, Store 등등 .. 

    클래스 모양 

    class Tv {
      // Tv의 속성 ( 멤버변수 )
      String color;         // 생상
      boolean power;		// 전원상태 (on/off)
      int chanel;			// 채널
      
      // Tv의 기능 ( 메서드 )
      void power()	{ power = !power; } 	// Tv를 켜거나 끄는 기능을 하는 메서드
      void channelUp() { ++channel; } 		// Tv의 채널을 높이는 기능을 하는 메서드
      void channelDown() {--channel; }		// Tv의 채널을 낮추는 기능을 하는 메서드
    }

     

    객체 만드는 방법 ( new 키워드 이해하기 )

    클래스의 기본 내용에 대해서는 위에서 알아보았다.

    이제 이 설계도 ( 클래스 )를 이용하여 실제 객체를 만드는 방법에 대해서 알아보도록 한다.

    class TvTest {
    	Tv tv;
        tv = new Tv();
        tv.channel = 7;
        tv.channelDown();
        System.out.println("현재 채널은 " + tv.channel + " 입니다.";
    }
    
    // 결과
    // 현재 채널은 6 입니다.
    개발을 조금 하신 분들에게는 .. 조금 불편한 코드일 수 있지만, 처음 공부한다는 마음으로 너그러운 아량을 ..

    이 예제에는 Tv 클래스로부터 인스턴스를 생성하고 인스턴스의 속성(channel)과 메서드 (channelDown())를 사용하는 방법을 보여 주는 것이다. 이 예제를 그림과 함께 단계별로 자세히 살펴보도록 한다.

     

    1. Tv tv;

    Tv 클래스 타입의 참조변수 t를 선언한다. 메모리에 참조변수 t를 위한 공간이 마련된다. 아직 인스턴스가 생성되지 않았으므로 참조변수로 아무것도 할 수 없다.

    2. tv = new Tv();

    연산자 new에 의해 Tv 클래스의 인스턴스가 메모리의 빈 공간에 생성된다. 주소가 0x100인 곳에 생성되었다고 가정하자. 이 때, 멤버변수는 각 자료형에 해당하는 기본값으로 초기화 된다.

    color는 참조형이므로 null로, power는 boolean이므로 false로, 그리고 channel은 int이므로 0으로 초기화된다.

    그 다음에는 대입연산(=)에 의해서 생성된 객체의 주소값이 참조변수 t에 저장된다. 이제는 참조변수 t를 통해 Tv 인스턴스에 접근할 수 있다. 인스턴스를 다루기 위해서는 참조변수가 반드시 필요하다.

    아래 그림에서의 화살표는 참조변수 tv가 Tv 인스턴스를 참조하고 있다는 것을 알기 쉽게 하기 위해 추가한 상징적인 것이다. 이 때, 참조변수 tv가 Tv 인스턴스를 '가리키고 있다' 또는 참조하고 있다'라고 한다.

     

    3. tv.channel = 7;

    참조변수 tv에 저장된 주소에 있는 인스턴스의 멤버변수 channel에 7을 저장한다. 여기서 알 수 있는 것처럼, 인스턴스의 멤버변수 (속성)를 사용하려면 '참조변수.멤버변수'와 같이 하면 된다.

    4. tv.channelDown();

    참조변수 t가 참조하고 있는 Tv인스턴스의 channelDown메서드를 호출한다. channelDown메서드는 멤버변수 channel에 저장되어 있는 값을 1감소시킨다.

    void channelDown() { --channel; }

    channelDown()에 의해서 channel의 값은 7에서 6이 된다.

    5. System.out.println("현재 채널은 "+ tv.channel + " 입니다.");

    참조변수 tv가 참조하고 있는 Tv 인스턴스의 멤버변수 channel에 저장되어 있는 값을 출력한다.현재 channel의 값은 6이므로 '현재 채널은 6입니다.'가 화면에 출력된다.

     

    class TvTest2 {
      public static void main (String args[]) {
      	Tv tv1 = new Tv();
        Tv tv2 = new Tv();
        System.out.println("tv1의 channel 값은 " + tv1.channel + "입니다.");
        System.out.println("tv2의 channel 값은 " + tv2.channel + "입니다.");
        
        tv1.channel = 7;
        System.out.println("tv1의 channel 값은 7로 변경되었습니다.");
        
        tv2 = tv1;
        System.out.println("tv1의 channel 값은 " + tv1.channel + "입니다.");
        System.out.println("tv2의 channel 값은 " + tv2.channel + "입니다.");
      }
    }

    1. Tv tv1 = new Tv(); Tv tv2 = new Tv();

    2. tv1.channel = 7;

    3. tv2 = tv1;

    // 결과

    // tv1의 channel 값은 7입니다.
    // tv2의 channel 값은 7입니다.

    메소드 정의하는 방법

    '메서드'는 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다. 기본적으로 수학의 함수와 유사하며, 어떤 값을 입력하면 이 값으로 작업을 수행해서 결과를 반환한다.

    메서드가 작업을 수행하는데 필요한 값만 넣고 원하는 결과를 얻으면 될 뿐, 이 메서드가 내부적으로 어떤 과정을 거쳐 결과를 만들어내는지 전혀 몰라도 된다. 즉, 메서드에 넣을 값(입력)과 반환하는 결과(출력)만 알면 되는 것이다. 그래서 메서드를 내부가 보이지 않는 '블랙박스'라고도 한다.

     

    메서드를 사용하는 이유

    메서드를 통해서 얻는 이점은 여러 가지가 있지만 그중에서 대표적인 세 가지를 소개하려한다. 아직은 메서드를 배우기 전이므로 여기서 나열하는 장점들이 잘 와 닿지 않을 수도 있지만, 이 장점들을 염두에 두고 있으면 메서드를 더 깊게 이해하는데 도움이 될 것이다.

    1. 높은 재사용성

    한번 만들어 놓은 메서드는 몇 번이고 호출할 수 있으며, 다른 프로그램에서도 사용이 가능하다.

    2. 중복된 코드의 제거

    반복되는 문장들을 묶어서 하나의 메서드로 작성해 놓으면, 반복되는 문장들 대신 메서드를 호출하는 한 문장으로 대체할 수 있다.

    3. 프로그램의 구조화

    큰 규모의 프로그램에서는 문장들을 작업 단위로 나눠서 여러 개의 메서드에 담아 프로그램의 구조를 단순화시키는 것이 필수적이다.

     

    메서드의 선언과 구현

    메서드는 크게 두 부분, '선언부'와 '구현부'로 이루어져 있다. 메서드를 정의한다는 것은 선언부와 구현부를 작성하는 것을 뜻하며 다음과 같은 형식으로 메서드를 정의한다.

    반환타입 메서드이름 (타입 변수명, 타입 변수명, ...)
    {
    	// 메서드 호출시 수행될 코드'
    }
    
    int add (int a, int b) 	// <- 선언부
    {						// <- 구현부
    	int result = a + b;
        return result;		// 호출된 메서드로 결과를 반환한다.
    }

    생성자 정의하는 방법

    생성자란?

     

    댓글

Designed by Gintire