자바야 어 반갑다 - 객체 지향 프로그래밍이란?

2022. 11. 1. 00:09강의 정리/Spring 기초

반응형

2년전 전공 수업때 만났던 자바를 Spring 프레임워크를 위해 다시 공부하기로 하였다.

 

 

 

사실 어느정도는 기억할 줄 알고 바로

 

스프링 공부를 시작했지만

 

 

개같이 털려버리고,  강의를 통해 다시 기억을 더듬고자 한다.

 

 

 

 

 

 

 

 

객체지향언어, 상속, 객체, 의존관계등등 어렵고도 거부감이 드는 단어들을 초심자의 마음을 가지고 다시 공부해보도록 하자

레츠기릿

 

 

 

강의 출처 : https://cloudstudying.kr/lectures/195

 

09 클래스와 객체 | CloudStudying

# 클래스와 객체 ## 들어가며.. --- 우리는 이전 파트에서 자바의 기본 문법에 대해 알아보았다. ![클라우드스터딩-자바-기본-문법-파트-요약](https://i.imgur.com/wU3oHxo.png) 이번 파트에서는 데이터와

cloudstudying.kr

 

 

 

먼저 첫번째 강의에서는 객체 지향 프로그래밍의 전반적인 정의와 여러 개념들에 대해서 공부하였다.

 

 

 

 

 

 

객체 지향 프로그래밍은 쉽게 말해 조립식 프로그래밍이라 할 수 있다. 객체를 조립하여 전체 프로그램을 만드는 것이다.

 

 

장점은 조립식으로 프로그램을 만들기에, 고장이 나도 해당 부분만 수리하면 되고, 또 기능을 추가할 때 만들어서 끼워 넣으면 된다는 것이다. 즉 관리, 재사용, 확장에 매우 유용하다.

 

 

객체는 클래스를 통해서 만들어지는 데 그러면 클래스와 객체의 차이는 무엇일까?

클래스와 객체의 차이는 클래스는 객체를 만들기 위한 설계도이고, 객체는 설계도를 통해 만들어지는 부품이라는 것이다. 

 

 

객체는 인스턴스(instance)라고도 부른다.

 

 

프로그램을 만들려면 여러 객체가 필요하고, 여러 객체를 만들려면, 객체별 클래스가 필요하다. 결과적으로,프로그램을 만들기 위해서는 클래스를 잘 만들어야 한다.

 

 

클래스를 잘 만들기 위해서는 먼저 클래스 다이어그램을 잘 만들어야한다.

 

 

클래스의 구조에 대해서 알아보자

클래스는 상태를 정의하는 필드와 동작을 정의하는 메소드로 나뉘어진다.

class Cat {
  /* 필드(상태) 영역 */
  String name;   // 이름
  String breeds; // 품종
  double weight; // 무게
  
  /* 메소드(동작) 영역 */
  void claw() {
    System.out.println("할퀴기!!");
  }
  void meow() {
    System.out.println("야옹!!");
  }
}

 

문제

주어진 코드는 두 개의 클래스, Main과 Dog로 이루어져있다. 아래의 클래스 다이어그램을 참조하여 Dog 클래스를 완성하고, 출력 예와 같은 결과를 얻으시오. (Main 클래스의 코드 그대로 사용 할 것)

출력 예

  1. 이름: null
  2. 품종: null
  3. 나이: 0

 

/* Main 클래스 */
public class Main {
  public static void main(String[] args) {
    // Dog 객체 생성
    Dog d = new Dog();
    
    d.name = "핫도그";
    d.breeds = "요크셔테리어";
    d.age = 2;  
    
  
    // Dog 객체 필드 값 출력
    System.out.printf("이름: %s\n", d.name);
    System.out.printf("품종: %s\n", d.breeds);
    System.out.printf("나이: %s\n", d.age);
  }
}

/* Dog 클래스 */
class Dog {
  /* 1. 필드 영역을 작성하시오. */
  String name;
  String breeds;
  int age;
  
  /* 2. 메소드 영역을 추가하시오. */
  void wag() {
    system.out.println("wak!");
  }
  
  void bark() {
    system.out.println("bark;");
  }
  
}

 

 

객체 생성 과정

 

위 Dog 클래스의 객체(인스턴스)를 만드는 코드는 아래와 같습니다.

 

// Dog 객체를 생성
new Dog();

 

 

일반적으로는 만든 객체를 다시 사용키 위해, 다음과 같이 변수로 이름을 붙여줍니다.

이는 숫자 86을 재사용하기 위해서 변수에 할당한 것과 같다.

// 객체 생성 후, dog1 변수에 연결
Dog dog1 = new Dog();

// 비교: 일반 변수
int score = 86;

 

 

생성된 객체는 연결된 변수에 닷(.) 연산을 함으로써, 접근할 수 있습니다.

// dog1 변수에 연결된 객체에 접근, name 변경.
dog1.name = "멍무이";

// dog1 변수에 연결된 객체에 접근, weight 변경.
dog1.weight = 4.27;

 

 

객체 생성시의 정확한 프로세스

 

1. new 연산자가 d 객체에 저장될 메모리 공간 할당

2. 생성자가 d 객체를 초기화

3. new 연산자가 새로 생성된 객체의 주소(reference) d 변수에 저장

4. d를 통해 Dog에 접근 가능

출처: https://sime.tistory.com/41 [심이 블로그:티스토리]

 

 

 

하나의 잘 설계된 클래스로, 여러 개의 객체를 만들 수 있습니다. 이는 마치, 붕어빵틀로 여러개의 붕어빵을 만드는 것과 같습니다.

 

/* 메인 클래스 */
public class BicycleTest {
  public static void main(String[] args) {
    // 자전거 객체 생성
    Bicycle b1 = new Bicycle();

    // 객체 필드값 초기화
    b1.name = "로드형 자전거";
    b1.weight = 7.25;
    b1.price = 326000;

    // 객체 정보 출력
    System.out.printf("b1->{%s, %.2f, %d}\n", b1.name, b1.weight, b1.price);
    
    /* 1. 새 자전거 객체 b2를 생성하시오. */
    /* 2. b2 객체의 필드를 초기화하시오. */
    /* 3. b2 객체 정보를 출력하시오. */
  }
}

/* 자전거 클래스 */
class Bicycle {
  /* 필드 */
  String name;    // 이름
  double weight;  // 무게
  int price;      // 가격

  /* 메소드 */
  void move() {
    System.out.println("자전거를 타고 이동합니다.");
  }
  
  void horn() {
    System.out.println("따르르릉! 지나갈게요~");
  }

 

 

아래는 Bicycle 클래스를 통해 두 객체를 생성하는 예입니다.

// 자전거 객체를 만들고, b1 변수에 대입
Bicycle b1 = new Bicycle();

// 자전거 객체 b2 생성
Bicycle b2 = new Bicycle();

b1과 b2는 서로 다른 객체이다. 상호 관계 X

 

 

객체는 생성, 초기화, 출력의 단계를 거친다.

 

생성

// 자전거 객체를 만들고, b1 변수에 대입
Bicycle b1 = new Bicycle();

 

초기화

b1.name = "산악자전거";
b1.weight = 7.25;
b1.price = 132000;

 

 

 

클래스를 통해 생성된 객체. 이를 인스턴스(instance)라 합니다. 아래는 Cat 인스턴스의 메소드인 meow()를 수행시키는 코드 예입니다.

 

Cat cat1 = new Cat();
cat1.meow(); // "야옹~"

이렇게 객체에 특정 동작을 수행시키는 것. 이를 “인스턴스 메소드 호출”이라 합니다.

 

클래스에서 동작을 하는게 아닌, 객체에서 동작을 하는 것이다!!

 

 

 

 

 

클래스 스코프

이러한 변수의 활동영역을 스코프(scope)라 합니다. 따라서 필드의 활동영역은 “클래스 스코프”가 됩니다.

 

필드의 활동 영역은 클래스 전체입니다. 따라서, 메소드 호출 시 필드를 사용할 수 있습니다.

class Dog {
    String name;
    int age;

    void bark() {
    // 해당 클래스의 필드 name을 사용
    System.out.println(name + "의 멍멍!");
}
}

 

각 객체에 저장된 필드를 메소드로 출력하거나 이용할 수 있다.

 

 

 

 

 

 

메소드 스코프

파라미터와 지역변수는 메소드 스코프를 가집니다. 다시 말해, 이들의 활동영역은 자신이 속한 메소드 내부입니다.

 

지역변수

여기서 지역변수란, 메소드 내부에 선언된 변수입니다.

class DrinkMachine {
  String output; // 필드 output 선언
  void pushButton(int num) { // 파라미터 num 선언
    // 지역변수 drinks 선언
    String[] drinks = {"콜라", "사이다", "맥주"};
    output = drinks[num];
  }
  void printOutput() {
    System.out.println(output);
  }
}

 

 

스코프 정리

  • 클래스 스코프: 필드
  • 메소드 스코프: 파라미터, 지역변수
반응형

'강의 정리 > Spring 기초' 카테고리의 다른 글

Spring boot 도메인 분석 설계  (1) 2022.11.18
Spring 실전편  (1) 2022.11.15
Spring 기초 정리본  (2) 2022.11.06