[Java의 정석]Chapter6.객체지향 프로그래밍(09~10)

Hello_Wendy·2022년 4월 15일
0

자바의 정석

목록 보기
37/61
post-thumbnail

Chapter 6. 객체지향 프로그래밍

09. 클래스의 정의(1) - 데이터와 함수의 결합

  • 프로그래밍언어에서 데이터 처리를 위한 데이터 저장형태의 발전과정

    1. 변수 : 하나의 데이터를 저장할 수 있는 공간
    2. 배열 : 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
    3. 구조체 : 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
    4. 클래스 : 데이터와 함수의 결합(구조체+함수)
  • 함수는 주로 데이터를 가지고 작업을 하기 때문에 많은 경우에 있어 데이터와 함수는 관계가 깊음

  • 자바와 같은 객체지향언어에서는 변수(데이터)와 함께 함수하나의 클래스에 정의하여 서로 관계가 깊은 변수와 함수들을 함께 다룰 수 있게 함

  • 서로 관련된 변수들을 정의하고 이들에 대한 작업을 수행하는 함수들을 함께 정의한 것이 클래스

  • C언어에서는 문자열을 문자의 배열로 다루지만, 자바에서는 String이라는 클래스로 문자열을 다룸
    ▶문자열을 단순히 문자의 배열로 정의하지 않고 클래스로 정의한 이유는 문자열과 문자열을 다루는데 필요한 함수들을 함께 묶기 위함

public final class String implements java.io.Serializable, Comparable {
	private char[] value; //문자열을 저장하기 위한 공간
    
    public String replace(char oldChar, char newChar) {
    	...
        char[] val = value; //같은 클래스 내의 변수를 사용해서 작업
        ...
    }
    ...

10. 클래스의 정의(2) - 사용자 정의 타입

  • 사용자정의 타입(user-defined type) : 프로그래밍언어에서 제공하는 기본 자료형(primitive type)외에 프로그래머가 서로 관련된 변수들을 묶어서 하나의 타입으로 새로 추가하는 것
  • 자바와 같은 객체지향언어에서는 클래스가 곧 사용자 정의 타입
  • 기본형의 개수는 8개로 정해져 있지만, 참조형의 개수가 정해져 있지 않은 이유프로그래머가 새로운 타입을 추가할 수 있기 때문
▶ 시간을 표현하기 위해 3개의 변수를 선언
int hour; //시간을 표현하기 위한 변수
int minute; //분을 표현하기 위한 변수
float second; //초를 표현하기 위한 변수, 1/100초 까지 표현하기 위해 float사용

▶만일 3개의 시간을 다뤄야 한다면 아래와 같음
int hour1, hour2, hour3;
int minute1, minute2, minute2;
float second1, second2, second3;

▶다뤄야 하는 시간의 개수가 늘어날 때마다 시,,초를 위한 변수도 추가해줘야 하는데 
데이터의 개수가 많으면 배열로 처리
int[] hour = new int[3];
int[] minute = new int[3];
float[] second = new float[3];
→ 시간 데이터의 개수가 늘어나더라도 배열의 크기만 변경해주면 되므로, 
변수를 매번 새로 선언해야하는 불편함은 사라짐

▶하나의 시간을 구성하는 시,,초가 서로 분리되어 있기 때문에 프로그램 수행과정에서
시,,초가 따로 뒤섞여 올바르지 않은 데이터가 될 가능성이 있기때문에 
시,, 초를 하나로 묶는 사용자정의 타입, 즉 클래스를 정의하여 사용
class Time {
	int hour;
    int minute;
    float second;
}

🍉 비객체지향적 코드와 객체지향적 코드

<비객체지향적 코드>
int hour1, hour1, hour3;
int minute1, minute2, minute3;
float second1, second2, second3;

int[] hour = new int[3];
int[] minute = new int[3];
float[] second = new float[3];

<객체지향적 코드>
Time t1 = new Time();
Time t2 = new Time();
time t3 = new Time();

Time[] t = new Time[3];
t[0] = new Time();
t[1] = new Time();
t[2] = new Time();
  • 시,분,초가 하나의 단위로 묶여서 다루어지면 다른 시간데이터와 섞이는 일은 없겠지만, 시간 데이터에는 추가적인 제약조건이 있음
  1. 시,분,초는 모두 0보다 크거나 같아야 함
  2. 시의 범위는 0~23, 분과 초의 범위는 0~59 임
  • 객체지향언어에서는 제어자메서드를 이용해서 조건들을 코드게 쉽게 반영 가능
<조건반영하여 Time클래스 작성>
public class Time {
	private int hour;
    private int minute;
    private float second;
    
    //hour의 값을 변경하기 위한 메서드. 지정한 값이 0보다 작거나 23보다 크면 
    //즉, 유효한 값이 아니면 변경하지 않고 메서드를 종료(return)함
    public void setHour(int h) {
    	if(h<0 || h>23) return;
        hour = h; //지정된 값(h)이 유효한 경우에만 hour를 변경
        }
        ...
 }
  • 제어자를 이용해서 변수의 값을 직접 변경하지 못하게 하고, 대신 메서드를 통해서 값을 변경하도록 작성
  • 값을 변경할 떄 지정된 값의 유효성을 조건문으로 점검한 다음에 유효한 값일 경우에만 변경
profile
안녕 나의 새로운 세상

0개의 댓글