본문 바로가기
[즐거운 자바 강좌] 정리

[즐거운 자바 강좌] 섹션2 - 객체지향문법(1)

by haeyoon 2024. 3. 31.

1. 객체지향 프로그래밍

 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나, 여러 개의 독립된 단위(=객체)들의 모임으로 파악하는 것

각각의 객체는 메시지를 주고받고 데이터를 처리한다.

 

  - 책상도면 예시

책상 도면

클래스 = 설계도면 클래스를 사용하려면 오브젝트를 만들어야함
인스턴스 & 오브젝트(객체) = 책상 설계도면으로 만들어짐
참조형변수 = 인스턴스를 사용하기 위한 이름  쓰레기(Garbage)

 객체지향 프로그래밍이란 클래스를 이용하지 않고, 실제 현실 객체(=책상)이용해 어떻게 객체가 동작할까 고민하는 것

 

[예시]

  Book b = new Book();

     → heap이라는 메모리에 인스턴스(=book) 생성

Book 레퍼런스 type  
b 참조 변수 - Book을 가르키는 레퍼런스 변수
- 값을 가지는 것이 아닌 객체를 가르키는 것
+int / double / short / long =참조형 타입X /특정 크기만큼 메모리 값 가짐
new 인스턴스 생성 Book 생성
Book() 생성된 인스턴스 =클래스 이름 = 생성자

 

new Book();

 

     →  참조변수 X  →  Garbage

 


2. 클래스

  = 필드(Field)메소드(Method)를 가진다

      - 필드: 클래스의 속성

      - 메소드: 클래스의 기능

접근제한자(public, protected, private) class 클래스이름 {

     필드들;

     생성자들;

     메소드들;

}

1) 클래스 선언 방법

 - 첫문자가 문자나 ‘_’, ‘$’의 특수문자로 시작되어야 한다. 숫자X
 - 첫문자가 아니라면, 문자나 ‘_’, ‘$’의 특수문자, 숫자로 구성될 수 있다.
     JDK8에서는 ‘_’한글자로 이루어진 변수는 예약어로 정의되어 있기 때문에 사용할 수 없다.
 - 자바의 예약어는 식별자로 사용X
- 자바의 식별자는 대소문자 구분O
  - 식별자 길이는 제한X, 공백포함X

 

관례
 - 클래스 명은 대문자로 시작
 - 카멜표기법 = 단어와 단어가 만날 경우 2번째 단어의 시작은 대문자
       Ex) ‘Hello’ & ’World’ 사용해서 클래스 이름 만든다면 ’HelloWorld’

 

 

2) 자판기 예시

 프로그래밍 시 사용자가 원하는 요구사항 정의 & 설계

① 요구사항 정의 = 어떤 객체로 구성되어 있을까? 객체들은 어떤 기능을 할까?

   - 명사 = 인스턴스 객체 (자판기, 물건, 동전)

해당 객체들은 다른 기계에서도 사용 가능

 

   - 동사 = 메소드 (동전넣기, 잔액보여주기)

 ② 설계 = 내가 만들어야 할 객체들의 이름, 클래스이름 정의  객체간의 관계 표현(=선 긋기)

화살표 방향 중요!

     자판기  1 동전통 (자판기는 1개의 동전통 가짐)

     상품배출기  상품케이스 (상품배출기가 상품케이스 이용)

 

[코드]

public class VendingMachine {
    // field
    // 생성자
    // method
}

 Field = 자판기가 가지는 것 (동전통, 상품케이스 등)

 Method = 자판기가 할 수 있는 기능

 → vendingMachine.class 라는 파일 생성 / but 사용X (실행되려면 main 메소드 있어야함)

public class VendingMachineMain {
    public static void main(String[] args){
        VendingMachine vm1 = new VendingMachine();
    }
}

 메모리상에 인스턴스 1개 생성

 메인메소드에 VendingMachine 클래스가 사용됨

- 모든 프로그램은 메모리에 올라가야지만 실행가능

     new 사용해야 클래스가 메모리에 올라가서 인스턴스 될 수 O  인스턴스에 올라가야만 오브젝트로 사용 가능 

     But static메소드는 바로 가능!

- VendingMachineMain VendingMachine 클래스 사용

   = VendingMachineMain VendingMachine에 의존한다 (String 클래스에도 의존함)

 


3. 인스턴스

  1) 인스턴스 생성

    ① new 연산자와 생성자를 이용

    ② 클래스 로더 이용

    ③ 메모리에 있는 인스턴스를 복제

 

  2) 메모리

    - 메모리에 올라가야만 실행O

    - new연산자 사용하면 메모리에 인스턴스생성 (너무 많아지면 메모리부족)

필요한 개수만큼 적적히 만들기


4. 메소드

만들고 싶은 프로그램 있을 때: 프로그램 구성하는 객체들이 메모리에 몇 개 올라가고, 메모리에 올라간 객체들끼리 어떤 관계인지 생각  클래스 작성

- 객체 지향의 핵심은 메시징이다.

 훌륭하고 성장 가능한 시스템을 만들기 위한 핵심은 모든 내부의 속성과 행동이 어떤가 보다 모듈이 어떻게 커뮤니케이션 하느냐에 달려있다.

객체에 메소드 호출

1) 메소드 선언

[접근 제한자] [static] 리턴type 메소드이름([매개변수, ...]){
	...
    //메소드 블록
 	...
}

 

[] 안은 생략 가능!

 

[코드]

Public static void main(String[] args) 메소드 블록

  - 매개변수: 메소드의 정의 부분에 나열되어 있는 변수들

  - 전달인자: 메소드를 호출할 때 전달되는 실제 값

  + 메소드 이름 = 소문자로 시작 (↔클래스 이름 = 대문자로 시작)

 

[예제] 

public String pushProductButton(int menuID)

자판기에 메소드를 추가한다.

- menuID가 1을 선택하면 "콜라", 2가 선택되면 "사이다", 3이 선택되면 "환타"를 반환한다.

 

public String pushProductButton(int menuID) {
    System.out.println(menuId + "를 전달받았습니다.");
    return "콜라";
}
public class VendingMachineMain {
    public static void main (String[] args){
        VendingMachine vm1 = new VendingMachine();
        VendingMachine vm2 = new VendingMachine();

        String product = vm1.pushProductButton(100);
        System.out.println(product);
    }
}

 → 출력

 

 2) 메소드 종류 (매개변수 / 반환값에 따라)

코드 마지막줄에 return 있어야함

 

 

 

 3) static 메소드

   static한 메소드는 인스턴스를 생성하지 않아도 호출할 수 있다.

VendingMachine.printVersion();

 

[예제1]

public class VendingMachine {
    //field
    //생성자
    //method
    public String pushProductButton(int menuId){
        System.out.println(menuId+"를 전달받았습니다.");
        return "콜라";
    }

    public static void printVersion(){
        System.out.println("1.0");
    }
}
public class VendingMachineMain {
    public static void main(String[] args){
        VendingMachine.printVersion();

        //String product = VendingMachine.pushProductButton(100); // 오류
        // pushproductbutton이 static이 아니기때문에 인스턴스를 생성하지 않은 메소드는 호출 불가

        VendingMachine vm1= new VendingMachine();

        String product = vm1.pushProductButton(100);
        vm1.printVersion(); // static한 메소드는 레퍼런스변수명.satic메소드() 도 가능
        System.out.println(product);
    }
}

 

 Q. java vendingMachineMain은 어디서 찾아서 실행?

    A.

   메소드 안에 선언된 지역변수는 메소드가 실행될 때 생성되었다가 메소드가 종료될 때 사라진다.

      동시에 메소드가 호출되어도 문제없다.

 

[예제2] Math Class 만들기

public class MathTest {
    public static void main(String[] args) {
        int value = Math.abs(-5);
        System.out.println(value);
    }
}

  출력: 5

public class MyMath {
    public static int abs(int x){
        if (x<0)
            return x * -1;
        else 
            return x;
    }
}
public class MyMathTest {
    public static void main(String[] args) {
        int value = MyMath.abs(-5);
        System.out.println(value);

        MyMath m = new MyMath();
    }
}

   + static없으면 오류