JAVA

객체지향 프로그래밍 1

woohap 2024. 11. 27. 00:17

객체지향언어의 특징

1. 코드의 재사용성이 높다.
상속을 통해 부모 클래스의 속성과 메서드를 자식 클래스에서 그대로 사용할 수 있어 재사용성 높음 
Ex) 부모 클래스를 상속받아 자식 클래스를 생성하면, 추가적인 코드 없이 부모 클래스 기능 사용 가능 

2. 코드의 관리가 용이하다.
코드의 구조를 클래스와 객체 단위로 나누어 관리하기 때문에 유지보수가 쉬움 
Ex) 부모 클래스의 메서드를 수정하면, 해당 메서드를 상속받은 모든 자식 클래스에서 수정된 메서드를 자동으로 사용 

3. 신뢰성 높은 프로그래밍을 가능하게 한다. 
접근 제어자를 사용하여 클래스 외부에서 필드와 메서드에 대한 접근을 제한 
Ex) Getter, Setter를 통해 데이터 접근 시 조건 검사를 수행 할 수 있다.

클래스와 객체

클래스

객체를 정의해 놓은 것 
객체를 정의한 설계도, 틀 

객체

실세계의 사물 같은 유형적인 것 개념, 논리와 같은 무형적인 것들을 코드로 추상화한 것 
객체는 속성과 기능을 가지며, 프로그래밍에서 이를 통해 실세계 사물이나 개념을 표현 

** 객체를 사용하려면 클래스를 먼저 정의해야한다.

객체와 인스턴스

클래스의 인스턴스화

클래스를 사용하여 객체를 만드는 과정을 의미

클래스의 인스턴스

클래스로부터 만들어진 객체를 의미 

객체 = 모든 인스턴스를 대표하는 포괄적인 의미
Ex) 현대 자동차 

인스턴스 - 특정 클래스로부터 만들어진 특정 객체를 의미
Ex) 아반떼, 소나타, 그랜저, 투싼, 싼타페 

객체의 구성요소

일반적으로 객체는 다수의 [속성]과 [기능]을 갖는다.
속성 - 필드(데이터)를 의미
기능 - 메서드를 의미 

인스턴스 생성과 사용

// 클래스명 변수명;
// 변수명 = new 클래스명();

Tv t;           // 생성된 인스턴스를 저장하기 위한 참조 변수 선언
t = new Tv();   // new 연산자를 이용해 인스턴스를 생성하고 
                // t 참조변수에 Student 인스턴스 주소를 저장 

참조변수 t에 생성된 Tv 인스턴스 주소를 저장

멤버 변수 접근 및 메서드 사용

// 해당 예시는 현재 인스턴스 변수와 메서드에 대한 것 (클래스 변수와 메서드 아님)
// 멤버 변수 접근 방법 
// 참조변수명.멤버변수명 
tv.channel 
tv.channel = 7

// 메서드 사용 
// 참조변수명.메서드명(매개변수)
tv.channelUp() 
**
인스턴스는 참조변수를 통해서만 다룰 수 있다.
참조변수의 타입은 인스턴스 타입과 일치해야한다. (부모 클래스로 선언 가능)

기타

// Tv 인스턴스를 생성하고 t1에 인스턴스 주소 저장 0x100
Tv t1 = new Tv();
// Tv 인스턴스를 생성하고 t2에 인스턴스 주소 저장 0x200
Tv t2 = new Tv();

// t2 참조변수에 0x100 저장 
t2 = t1;

// 이 경우 0x200 인스턴스에 접근할 수 없게 됨
// 이 때 가비지 컬렉터에 의해 자동적으로 메모리에서 제거된다.

t2 참조변수에 t1에 저장된 인스턴스 주소 저장

객체 배열

배열의 요소로 객체를 저장
객체 배열 안에는 객체의 주소가 저장된다.
즉, 객체 배열은 참조변수들을 하나로 묶은 참조변수 배열이다. 
객체 배열의 경우 선언시 모든 요소가 null로 자동 초기화 된다.

**
다형성을 활용하여 여러 타입의 객체를 객체 배열에 저장할 수 있다. 
Ex) 자동차 클래스 타입의 객체 배열에 스포츠카 인스턴스, 트럭 인스턴스 주소 저장 가능

프로그래밍 관점에서 클래스의 정의와 의미

1. 변수
하나의 데이터를 저장할 수 있는 공간

2. 배열 
같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간 

3. 구조체 
서로 관련된 여러 데이터를 종류에 관계 없이 하나의 집합으로 저장할 수 있는 공간

4. 클래스
데이터와 함수의 결합(구조체 + 함수)

사용자 정의 타입 클래스

[사용자가 직접 정의한 클래스]
기본 타입은 8가지로 고정
참조 타입은 제한이 없음
즉, 사용자 정의 클래스 정의 제한이 없음 
// 클래스 없이 사용 
int hour1, hour2, hour3;
int minute1, minute2, minute3
int second1, second2, second3

// 클래스 정의
class Time {
    int hour;
    int minute;
    int second;
}

Time time1 = new Time(hour1,minute1,seconde1);
Time time2 = new Time(hour2,minute2,seconde2);
Time time3 = new Time(hour3,minute3,seconde3);
시간 데이터는 추가적인 제약조건이 있음
- 시, 분, 초 모두 0보다 크거나 같아야 함 
- 시의 범위는 0~23, 분과 초의 범위는 0~59
public class Time {
    private int hour;
    private int minute;
    private int second;

    public int getHour() { return hour; }
    public int getMinute() { return minute; }
    public int getSecond() { return second; }

    public void setHour(int h) {
        if (h < 0  || h > 23 ) return;
            hour = h;
    }

    public void setMinute(int m) {
        if (m < 0 || h > 59 ) return ;
            miute = m;        
    }

    public void setSecond(int s) {
        if (s < 0.0f || s > 59.99f ) return ;
            second = s;
    }
}
제어자를 이용해서 직접 데이터를 접근하지 못하도록 함 
Setter 함수를 정의해, 특정 조건을 만족할 때만 멤버 변수(필드) 값을 변경할 수 있도록 함 

변수

자바에는 클래스 변수, 인스턴스 변수. 지역 변수가 존재 

멤버 변수

클래스 내부에 선언된 변수를 의미한다.
클래스 변수와 인스턴스 변수가 존재 

클래스 변수

static 키워드를 사용하여 선언한 변수는 클래스 변수 
즉, 인스턴스가 생성되지 않아도 사용할 수 있는 변수
클래스 변수의 경우 해당 클래스로 생성된 모든 인스턴스에서 공유한다. 
즉, 인스턴스들이 공통적으로 유지해야하는 값은 클래스 변수를 사용 

[클래스명.변수명] 형태로 접근 가능

인스턴스 변수

static 키워드를 사용하지 않고 선언한 변수는 인스턴스 변수
인스턴스를 생성해야만 사용할 수 있는 변수 
인스턴스 변수의 경우 각 인스턴스가 고유한 값(서로 다른 값을 가질 수 있음)을 갖는다.
즉, 각 인스턴스가 고유한 값을 가져야하는 경우 인스턴스 변수를 사용 

[인스턴스명.변수명] 형태로만 접근 가능

멤버 변수 코드

class Test {
  // 클래스 변수 
    static int a ;

    // 인스턴스 변수 
    int b ;
}

public static void main(String[] args) {
    // 클래스 변수 이므로 사용 가능 
    Test.a = 10;

    // 인스턴스 변수의 경우 인스턴스를 생성한 다음에만 접근 가능 
    Test t1 = new Test();
    t1.b = 20; 
}

멤버 변수 요약

인스턴스 변수는 인스턴스가 생성될 때 생성되어 각기 다른 값을 유지할 수 있음
클래스 변수는 모든 인스턴스가 하나의 저장공간을 유지하므로 항상 공통된 값을 갖는다. 

지역 변수

메서드 내에 선언되어 메서드 내에서만 사용 가능한 변수들을 의미
메서드가 실행될 때 생성되며, 메서드가 종료되면 제거된다.
public void hello() {
  // 지역 변수 
    int a ;
}

'JAVA' 카테고리의 다른 글

Object 클래스의 메서드  (0) 2024.12.04
JAVA Collection Framework 3  (0) 2024.11.26
JAVA Collection Framework 2  (0) 2024.11.25
JAVA Collection Framework 1  (0) 2024.11.24