열심히 끝까지

Java1 day05 본문

Java1(주말)

Java1 day05

노유림 2022. 4. 23. 15:58

[5일차 수업 내용]

1. 객체지향언어 ( 클래스객체

2. 변수와 메소드

============================================================================

[ 객체지향언어 ( 클래스와 객체 ) ]

 

1. 객체지향언어

       - 기본 개념은 ' 실제 세계는 사물(객체)로 이루어져 있으며 발생하는 모든 사건들은 사물간의 상호작용이다. ' 

         라는 것

 

       - 실제 사물의 속성과 기능을 분석한 다음 데이터(변수)와 함수로 정의함으로써 실제 세계를 컴퓨터 속에

         옮겨놓은 것과 같음

 

       - 객체지향언어의 주요 특징

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

                - 새로운 코드를 작성할 대 기존의 코드를 이용하여 쉽게 작성할 수 있음

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

                - 코드의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있음

       ③ 신뢰성이 높은 프로그래밍을 가능하게 함

                - 제어자와 메소드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며,

                  코드의 중복을 제거하여 코드의 불일치로 인한 오작동을 방지할 수 있음

 

2. 클래스와 객체

       2-1 ) 클래스와 객체의 정의와 용도

               - 클래스객체를 정의해 놓은 것이며 클래스는 객체를 생성하는데 사용

                 (객체를 만드는 틀 = 클래스)

               - 객체의 사전적인 정의는 실제로 존재하는 것

               - 객체지향이론에서는 사물과 같은 유형적인 것뿐만 아니라 개념이나 논리와 같은 무형적인 것들도

                 객체로 간주

 

              Ex)       클래스                          객체

                        제품설계도                     제품

                        Tv 설계도                       Tv

                        붕어빵기계                     붕어빵

 

       2-2 ) 객체와 인스턴스

                - 클래스로부터 객체를 만드는 과정을 클래스의 인스턴스라고 하며

                  어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스(instance)라고 함.

 

                Tv는 Tv클래스의 인스턴스

                Tv는 객체이다. ( 엄격히 구분할 필요는 없음)

 

       2-3 ) 객체의 구성요소 - 속성과 기능

                - 객체속성과 기능, 두 종류의 구성요소로 이루어져 있으며 일반적으로 객체는

                  다수의 속성과 다수의 기능을 가짐

                - 즉, 객체는 속성과 기능의 집합

                - 객체가 가지고 있는 속성과 기능을 그 객체의 멤버(member) 라고 함

                - 클래스는 객체를 정의한 것

                  => 클래스로부터 객체를 생성하면 정의된 속성과 기능을 가진 객체가 만들어 짐

 

                * 속성(property), 멤버변수(member variable), 특성(attribute), 필드(field), 상태(state)

                * 기능(fuction), 메소드(method), 함수(function), 행위((behavior)

 

      2-4 ) 인스턴스의 생성과 사용

               - 클래스로부터 인스턴스를 생성하는 방법은 아래와 같이 여러가지가 있음

 

                            클래스 변수명;                         // 클래스의 객체를 참조하기 위한 참조변수 선언

                            변수명 = new 클래스명();           // 클래스의 객체를 생성한 후, 객체의 주소를 참조변수에 저장

                            Tv t;

                            t = new Tv();

 

                            Tv t = new Tv();

                            Tv t1 = new Tv();                      // t 와 t1은 서로 독립적

 

               - 인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 함

               - 같은 클래스로부터 생성되었을지라도 각 인스턴스는 서로 독립적

 

                          Tv[] t = new Tv[3];                             int[] ar = new int[3];

                          t[0] = new Tv();                                 ar[0] = 10;

                          t[1] = new Tv();                                 ar[1] = 20;

                          t[2] = new Tv();                                 ar[2] = 30;

 

               - 객체 역시 배열로 다루는 것이 가능하며 이를 ' 객체 배열 ' 이라고 함

 

       2-5 ) 클래스의 또 다른 정의

                ① 클래스 - 데이터와 함수의 결합

                          변수 -> 배열(변수의 묶음) -> 구조체(다른 값들도 담은 배열) -> 클래스

                ② 클래스 - 사용자 정의 타입(user-defined type)

                                  - 프로그래밍언어에서 제공하는 자료형 외에 프로그래머가 서로 관련된 변수들을 

                                    묶어서 하나의 타입으로 새로 추가하는 것 "사용자 정의 타입"이라고 함 

 

 

============================================================================

[ 변수와 메소드 ]

1. 변수와 메소드

       1-1 ) 선언 위치에 따른 변수의 종류

                - 변수는 클래스변수(static), 인스턴스변수, 지역변수 총 3가지 존재

                - 변수의 종류를 결정짓는 중요한 요소는 '변수의 선언된 위치',

                   => 변수의 종류를 파악하기 위해서는 변수가 어느 영역에 선언되었는지를 확인하는 것이 중요

                - 멤버변수를 제외한 나머지 변수들은 모두 지역변수,

                  멤버변수 중 static이 붙은 것클래스변수

                  붙지 않는 것인스턴스 변수

변수의 종류 선언 위치 생성시기(사용가능시기)
클래스변수 클래스영역 클래스가 메모리에 올라갔을 때
인스턴스변수 인스턴스가 생성되었을 때
지역변수 클래스 영역 이외의 영역
(메소드, 생성자, 초기화블록...)
변수 선언문이 수행되었을 때

               인스턴스 변수 ( instance variable )

                               - 클래스 영역에 선언, 클래스의 인스턴스를 생성할 때 만들어짐

                               - 인스턴스 변수의 값을 읽어오거나 저장하기 위해서는 먼저 인스턴스를 생성해야 함

 

               클래스 변수 ( class variable )

                               - 클래스변수를 선언하는 방법은 인스턴스변수 앞에 static을 붙이기만 하면 됨

                               - 클래스변수는 모든 인스턴스가 공통된 저장공간(변수)를 공유

                               - 클래스변수는 인스턴스변수와 달리 인스턴스를 생성하지 않고도

                                 언제라도 바로 사용할 수 있는 특징을 가지고 있음

                               - '클래스이름 . 클래스변수' 와 같은 형식으로 사용

 

               지역 변수 ( local variable )

                              - 메소드 내에 선언되며 메소드 내에서만 사용 가능

                                => 메소드가 종료되면 소멸되어 사용 불가

                              - for문 또는 while문의 블록 내에 선언된 지역변수가 선언된 블록{ } 내에서만 사용 가능

                                => 블록을 벗어나게 되면 소멸되어 사용 불가

 

                * 인스턴스 변수는 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만,

                  클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 가짐

 

2. 메소드(method)

       - 메소드는 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것

       - 기본적으로 수학의 함수와 유사, 어떤 값을 입력하면 이 값으로 작업을 수행해서 결과를 반환

 

       2-1 ) 메소드를 사용하는 이유?

               높은 재사용성(reusability)

                          - 한번 만들어 놓은 메소드는 몇번이고 호출 가능

                            다른 프로그램에서도 사용 가능

                중복된 코드의 제거

                          - 같은 내용의 문장들이 여러 곳에 반복해서 나타난다면

                            이렇게 반복되는 문장들을 묶어서 하나의 메소드로 작성해 놓으면

                            반복되는 문장들 대신 메소드를 호출하는 한 문장으로 대체

                ③ 프로그램의 구조화

                          - 큰 규모의 프로그램에서는 문장들을 작업단위로 나눠서 여러 개의 메소드에 담아

                            프로그램의 구조를 단순화시키는 것이 필수

                          - main 메소드는 프로그램의 전체 흐름이 한 눈에 들어올 정도로 단순하게 구조화하는 것이 좋음

 

       2-2 ) 메소드의 선언과 구현

                - 메소드는 크게 두 부분, 선언부구현부로 이루어져 있음

                - 메소드를 정의한다는 것은 선언부와 구현부를 작성한다는 뜻

 

                반환타입 메소드이름 ( 타입 변수명, 타입 변수명 ... ) {

                               // 메소드 호출 시 수행될 코드

                }  

                

          Ex ) int sum ( int number ) {                   // { 전까지 선언부

                         return number + 10;              // { 부터 } 까지 구현부

                }

 

               메소드 선언부( method declaration, method header )

                                - 메소드가 작업을 수행하기 위해 어떤 값들을 필요로 하고, 

                                  작업의 결과로 어떤 타입의 값을 반환하는 지에 대한 정보를 제공

                                - 메소드 선언부는 후에 변경사항을 발생하지 않도록 신중히 작성

 

               매개변수 선언( parameter declaration )

                                - 매개변수는 메소드가 작업을 수행하는데 필요한 값들을 제공받기 위한 것,

                                  필요한 값의 개수만큼 변수를 선언하여 각 변수간의 구분을 쉼표로 사용

 

               메소드 이름( method name )

                                - 메소드는 특정 작업을 수행하므로 메소드의 이름은 동사인 경우가 대다수

                                  메소드의 기능을 쉽게 알 수 있도록 함축적이면서도 의미있는 이름을 짓도록 노력해야 함

 

               반환타입( return type )

                                - 메소드는 작업수행 결과인 반환값( return value )의 타입을 적음

                                - 반환값이 없는 경우 반환타입으로 void를 적음

 

               메소드의 구현부( method body, 메소드 몸통 )

                                - 메소드의 선언부 다음에 오는 괄호를 메소드의 구현부라고 함

                                  여기서 메소드를 호출했을 때 수행될 문장들을 기록

 

               return문

                                - 메소드의 타입이 void가 아닌 경우 구현부 안에

                                  "return 반환값'" 이 반드시 포함되어 있어야 함

                                - 이 문장은 작업을 수행한 결과인 반환값을 호출한 메소드로 전달함

                                  => 이 값의 타입은 반환타입과 일치하거나 적어도 자동형변환이 가능한 것이어야 함

                                - return 문은 단 하나의 값만 반환 가능

 

                long                                return 10;    <- 가능

                int                                  return 10L;   <- 불가능

                return 1, 2, 3, 4                                  <- 불가능(여러 값을 한꺼번에 변환 불가능)

                return 1 / return 2 ....                           <- 가능(하나씩 값을 변환)

 

       2-3 ) 메소드의 호출

                - 메소드를 정의했어도 호출하지 않으면 아무런 일도 일어나지 않음

                - 메소드를 호출해야만 구현부의 문장들이 수행

 

                - int sum(int num) { }                ==>                   sum(10);

                                                                   메소드이름(파라미터);

 

       2-4 ) JVM의 메모리 구조

-----------------------------------------------------------------------------------------------------------------------------------Method Area

                                                클래스 데이터 ( cv : class variable )

-----------------------------------------------------------------------------------------------------------------------------------Call Stack

                                                main ( lv : variable )

-----------------------------------------------------------------------------------------------------------------------------------Heap

                                                인스턴스 ( iv : instance variable )

-----------------------------------------------------------------------------------------------------------------------------------

 

                메소드 영역 ( Method area )

                                - 프로그램 실행 중 어떤 클래스가 사용되면, JVM인 해당 클래스의 클래스파일을 분석하여

                                  클래스에 대한 정보를 이곳에 저장

                                - 이 때 그 클래스의 클래스변수(static변수)도 이 영역에 함께 생성

 

               힙 영역 ( Heap area )

                                - 인스턴스가 생성되는 공간, 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 저장

 

               호출 스택 ( Call area ) - LIFO ( Last in First Out )

                                - 호출스택은 메소드의 작업에 필요한 메모리 공간을 제공

                                - 메소드가 호출되면, 호출스택에 호출된 메소드를 위한 메모리가 할당

                                  이 메모리는 메소드가 작업을 수행하는 동안 지역변수들과

                                  연산의 중간결과들을 저장하는데 사용

 

       2-4 ) 기본형 매개변수와 참조형 매개변수

                - 자바에서는 메소드를 호출할 때 매개변수로 지정한 값을 메소드의 매개변수에 복사하여 넘겨줌

                - 매개변수의 타입이 기본형일 때는 기본형 값이 복사, 참조형이면 인스턴스의 주소가 복사

 

                int add(int a, int b){ }                                ==>                add(10, 20);

 

                void method(Tv tv){ }                                ==>                Tv t = new Tv();

                      tv의 주소가 100                                                           method(t);    // t의 주소가 100

 

                기본형 매개변수                변수의 값을 읽기만 할 수 있음( read only )

                참조형 매개변수                변수의 값을 읽고 변경할 수 있음( read & write )

 

                - 이 때 반환타입이 참조형이라는 것은 메소드가 객체의 주소를 반환한다는 것

 

--------------------------------------------------------------------------------------------------------------------------------

 

package example01;

 

public class Tv {

 

       // Tv의 속성(멤버변수, member variable)

       String color;       // 색상

       boolean power   // 전원상태(on/off)

       int channel;       // 채널

 

       // Tv의 기능(메소드, method)

       void power() {  // Tv를 켜거나 끄는 기능을 하는 메소드

             power = !power;

       }

       

       void channelUp() {  // Tv의 채널을 높이는 기능을 하는 메소드

             ++channel;

       }

 

       void channelDown() {  // Tv의 채널을 낮추는 기능을 하는 메소드

             --channel;

       }

}

---------------------------------------------------------------------------------------------------------------------

 

package example01;

public class TvEx01 {

       public static void main(String[] args){

             // step 1 : Tv 인스턴스를 참조하기 위한 참조변수 t 선언

             Tv t;

 

             // step 2 : Tv 인스턴스를 생성하고 참조변수와 연결

             t = new Tv();

 

             // step 3 : Tv 인스턴스의 멤버변수 channel의 값을 7로 변경

             t.channel = 7;

             System.out.println("channel : " + t.channel);       // 7 

 

             // step 4 : Tv 인스턴스의 메소드 ChannelDown()을 호출

             t.channelDown();

             System.out.println("channel : " + t.channel);       // 6

 

             Tv t1 = new Tv();

             System.out.println("channel : " + t1.channel);       // 0(초기값)

       }

}

-------------------------------------------------------------------------------------------------------------------------------

 

package example01;
public class TvEx03 {
       public static void main(String[] args) {
       // 객체배열
             int number1 = 1;
             int number2 = 2;
             int number3 = 3;
             // 위 변수들을 하나로 합칠 수 없을까? -> 배열 탄생
             int[] number = new int[3];
             number[0] = 1; 
             number[1] = 2;
             number[2] = 3;

             Tv t1 = new Tv();
             Tv t2 = new Tv();
             Tv t3 = new Tv();
             // 위 변수들을 하나로 합치 수 없을까? -> 객체배열 탄생
             Tv[] t = new Tv[3];
             t[0] = new Tv();
             t[1] = new Tv();
             t[2] = new Tv();

             // 아래 객체배열의 모든 칸을 채워넣어라 단, for문을 이용해서
             Tv[] tvs = new Tv[5];

             for(int i = 0; i < tvs.length; i ++){
                    tvs[i] = new Tv();
                    tvs[i].channel = i + 10;
                    System.out.println("각 tv의 채널 : " + tvs[i].channel);
             }
       }
}
----------------------------------------------------------------------------------------------------------------

package example02;
public class MemberCallTest {
       int iv = 10; // 인스턴스변수
       static int cv = 20;  // 클래스변수

       // static  int cv2 = iv; // 에러
       /*
        *  클래스 변수는 인스턴스 변수를 사용할 수 없다.
        *  왜why? 클래스변수가 메모리에 올라갈 때 인스턴스 변수는 생성이 안되어 있을 수도 있다.
        *  즉, 만들어지지도 않은 애를 어떻게 변수로 올리는가?
        */
       static int cv2 = new MemberCallTest().iv;
       // iv를 보기 위해서 MemberCallTest를 열어주고 iv를 가져온다.

       int iv2 = cv;
       /*
        * 인스턴스변수는 클래스변수를 사용할 수 있다.
        * 왜why? 인스턴스변수가 메모리에 올라갈 때는 이미 클래스변수는 메모리에 올라가 있기 때문에
        */
}
----------------------------------------------------------------------------------------------------------------------

package example02;
public class MyMath {
       // 덧셈, 뺄셈, 곱셈, 나눗셈 메소드
       
       // 1. 두 개의 정수를 전달받아 두 수의 합을 return 하는 메소드
       int add(int a, int b) {
              int result = a + b;
             //return result;  1번째 방법
             return a + b;    // 2번째 방법 (바로 넘기기)
       }

       // 2. 두 개의 정수를 전달받아 두 수의 차를 return 하는 메소드
       int substract(int a, int b) {
              // int result = a - b;
              return a - b;
       }

       // 3. 두 개의 정수를 전달받아 두 수의 곱을 return 하는 메소드
       int multiply(int a, int b) {
             int result = a * b;
             return result;
       }

       // 4. 두 개의 정수를 전달받아 두 수의 결과를 return 하는 메소드(몫을 return)
       int divide(int a, int b) {
             // int result = a / b;
             return a / b;
       }
}
-------------------------------------------------------------------------------------------------------

 

package example02;

public class MyMathEx01 {
       public static void main(String[] args) {
             MyMath mm = new MyMath();

             int result1 = mm.add(5, 3);
             // return이 있는 메소드는 하나의 값으로 생각하자.
             int result2 = mm.substract(10, 4); // mm.---를 하나의 값으로 볼 것
             int result3 = mm.multiply(3, 4);
             int result4 = mm.divide(10, 2);


             System.out.println("result1 : " + result1);
             System.out.println("result2 : " + result2);
             System.out.println("result3 : " + result3);
             System.out.println("result4 : " + result4);

             System.out.println(mm.add(10, 20));
             System.out.println(10 + 20);
             System.out.println(30);
       }
}

 

'Java1(주말)' 카테고리의 다른 글

Java1 day06  (0) 2022.04.24
Java1 day05 보충  (0) 2022.04.24
Java1 day04 보충  (0) 2022.04.23
Java1 day04  (0) 2022.04.17
Java1 day03 보충  (0) 2022.04.17