JAVA - 객체지향 프로그래밍 1

이상원·2022년 4월 17일
0

JAVA

목록 보기
2/6

클래스

클래스의 정의

  1. 사용자 정의 타입
    프로그래밍 언어에서 기본으로 제공하는 기본 자료형(primitive type)외에 프로그래머가 서로 관련된 변수들을 묶어서 하나의 타입으로 새로 추가하는 것을 '사용자 정의 타입(user-defined-type)' 이라고 한다. 자바와 같은 언어에서는 클래스가 곧 사용자 정의 타입이다.

  2. 데이터와 함수의 결합
    프로그래밍적인 관점에서 데이터 처리를 위한 데이터 저장형태의 발전과정은 다음과 같다. 그 동안은 데이터와 함수가 관계없듯이 데이터는 데이터대로 함수는 함수대로 따로 다뤄왔지만 실은 함수는 데이터를 가지고 작업함으로 연관성이 깊다. 따라서 자바와 같은 객체 지향 언어는 변수(데이터)와 함수를 하나의 클래스에 정의하여 서로 관계가 깊은 변수와 함께 다룰 수 있게 했다.

클래스

클래스는 '객체를 정의해놓은 것' 또는 '객체의 설계도 혹은 틀' 이러한 클래스는 객체를 정의하는 데 사용이 되며 객체는 클래스에 정의된 대로 생성된다.

  • 속성과 기능이 정의된 것

객체

실제로 존재하는 것 사물 또는 개념이며 클래스에 정의된 내용을 기반으로 메모리에 생성된 것이다.

  • 속성과 기능이 구현된 것

객체 지향 프로그래밍의 장점

  1. 코드의 재사용성이 높다
  • 기존의 코드의 활용이 가능하다.

  1. 코드의 관리가 용이하다.
  • 코드들간의 관계를 통해 적은 노력으로 쉽게 코드를 변경할 수 있다.

  1. 신뢰성이 높은 프로그래밍이 가능하게 한다.
  • 제어자의 메서드를 이용 데이터를 보호(ex. getter, setter) 올바른 값을 유지하도록 하며, 코드의 중복을 방지 오작동을 예방한다.

객체 배열

객체 배열은 많은 수의 객체를 다룰 때 용이한 방식이다. 각 요소는 참조변수의 기본값인 null로 자동 초기화 되며, 이 객체 배열은 각 객체의 주소를 저장할 수 있다.

class Time {
	int hour;
	int minute;
	int second;
}

Time[] t = new Time[3];
t[0] = new Time();
t[1] = new Time();
t[2] = new Time();

클래스 변수와 인스턴스 변수

변수 선언 위치에 따라 변수의 종류가 결정되어 진다.

멤버 변수중 static이 붙은 것이 클래스 변수 안붙은 것은 인스턴스 변수이다. 아울러 나머지 변수들은 모두 지역 변수이다.

클래스 변수는 속성 중 객체의 공통 속성인 것을 클래스 변수로 선언하며 객뱔 객체마다 다르게 유지되어야 하는 것은 인스턴스 변수로 선언을 해준다!

메서드

메서드란 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다. 자바에서 메서드는 클래스 영역에서만 정의할 수 있다.

호출 스택

호출 스택은 메서드 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면 호출스택에 호출된 메서드를 위한 메모리가 할당되며 메서드가 작업하는 동안 연산의 중간결과들을 저장하는 데 사용이 된다.

클래스 메서드와 인스턴스 메서드

// 작성 예정

오버로딩

한 클래스 내에 같은 이름의 메서드 여러 개를 정의하는 것을 '메서드 오버로딩'이라고 한다. 오버로딩이 성립하기 위해서는 다음과 같은 3가지 조건을 만족해야 한다.

  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.
  3. 반환 타입은 관계없다.
// System.out.println메서드에는 다양한 오버로딩된 함수들을 가지고 있다.
void println(boolean x)
void println(int x)
void println(char x)
void println(double x)
void println(Object x)

예시)

//보기 1 매서드 중복 정의 오류 날 것이다. already defined
int add(int a, int b){return a+b;}
int add(int x, int y){return a+b;}

//보기 2 매서드 중복 정의 오류 날 것이다. already defined
int add(int a, int b){return a+b;}
long add(int a, int b){return a+b;}

//보기 3 오버로딩 매개변수 타입이 다르다!
long add(int a, int b){return a+b;}
long add(int a, long b){return a+b;}

생성자

생성자는 인스턴스(객체 iv 묶음)가 생성될 때 호출되는 인스턴스 초기화 메서드이다. 따라서 인스턴스 변수의 초기와 작업을 위해 사용된다. 또한 모든 클래스에는 반드시 하나 이상의 생성자가 존재해야 한다. 생성자의 조건은 다음과 같다.

생성자의 생성 조건

  1. 생성자의 이름은 클래스의 이름과 같아야 한다.
  2. 생성자는 리턴 값이 없다.
  3. 생성자의 첫 줄에는 반드시 생성자를 호출해야 한다.


참고로 연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이다. 인스턴스는 단순히 인스턴스 변수들의 초기화에 사용되는 특별한 메서드일 뿐이다.

기본 생성자

클래스에서 생성자를 정의하지 않고도 인스턴스를 생성할 수 있었던 이유는 컴파일러가 제공하는 '기본 생성자(default constructor)'덕분이었다. 컴파일 시 생성자가 하나도 정의되지 않은 경우 자동으로 기본 생성자를 추가하여 컴파일 한다. 하지만 하나라도 생성자가 존재한다면(ex. 매개 변수 생성자,...) 기본 생성자가 생성되지 않는다.

  • 기본 생성자가 컴파일러에 의해 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때 뿐이다.
  • 기본 생성자 넣는 것을 필수로 하자.

매개 변수 생성자

생성자도 매서드처럼 매개변수를 선언하여 호출 시 값을 넘겨받아서 인스턴스의 초기화 작업에 사용할 수 있다. 인스턴스마다 각기 다른 값으로 초기화 된 경우가 많기 때문에 매개변수를 사용한 초기화는 매우 유용하다.

class Car{
	String color;
    String gearType;
    int door;
    
    Car(){ } // 기본 생성자
    Car(String c, String g, int d){ // 매개변수 생성자
    	color = c;
        gearType = g;
        door =d;
    }
    
}

생성자에서 다른 생성자 호출하기 - this()

같은 클래스의 멤버들 간에 서로 호출할 수 있듯이 생성자 간에도 서로 호출할 수 있다.
이를 위해서는 다음과 같은 조건을 만족해야 한다.

  1. 생성자의 이름으로 클래스 이름 대신 this를 사용한다.
  2. 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
Car(string color)
{
	door=5;
    Car(color,"auto", 4); 	// error this(color,"auto", 4); 로 해야 함
    						// error 생성자의 두번째 줄에서 다른 생성자 호출
}

생성자에서 다른 생성자 첫 출에서만 호출이 가능하도록 한 이유는 생성자(A) 내에서 초기화 작업도중에 다른 생성자(B)를 호출하게 되면 호출된 다른 생성자(B) 내에서도 값을 초기화 할 것이므로 다른 생성자를 호출하기 이전의(A) 초기화 작업이 무의미해질 수 있기 때문이다.

객 체 자신을 가리키는 참조변수 - this

this는 참조변수로 인스턴스 자신을 가리킨다. 참조변수를 통해 인스턴스의 멤버에 접근할 수 있는 것처럼 this로 인스턴스 변수에 접근할 수 있는 것이다.

한편 인스턴스 변수와 매개변수로 선언도니 지역변수의 이름이 같은 경우 혼동이 올 수 있다. 이러한 경우를 막기 위해서 this를 통해 구별을 한다.

Car(String color, String gearType, int door){ // 매개변수 생성자
    	this.color = color;
        this.gearType = gearType;
        this.door =door;
    }

변수의 초기화

참고 문헌

자바의 정석 - 기초편

profile
개발하는 코린이

0개의 댓글