본문 바로가기

프로그래밍/JAVA

[JAVA 이론] 객체지향 프로그래밍_1

객체지향언어

실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호작용이다.

 

특성

  1. 코드의 재사용성이 높다.
    새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다.
  2. 코드의 관리가 용이하다.
    코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.
  3. 신뢰성이 높은 프로그래밍을 가능하게 한다.
    제어자의 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다.
클래스와 객체

클래스

클래스의 정의: 클래스란 객체를 정의해 놓은 것이다.

클래스의 용도: 클래스는 객체를 생성하는데 사용된다.

 

객체

프로그래밍에서 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻함

객체의 정의: 실제로 존재하는 것, 사물 또는 개념

객체의 용도: 객체가 가지고 있는 기능과 속성에 따라 다름

 

유형의 객체: 책상, 의자, 자동차, TV와 같은 사물

무형의 객체: 수학공식, 프로그램 에러와 같은 논리나 개념

 

어떤 클래스로부터 만들어진 객체를 "인스턴스"라 하며 클래스로부터 객체를 만드는 과정을 "인스턴스화"라고 한다.

 

객체의 속성: 멤버변수, 특성, 필드, 상태

기능: 메서드, 함수, 행위

 

인스턴스의 생성과 사용

인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야한다.

클래스명 참조변수명; //클래스의 객체를 참조하기 위한 참조변수를 선언
참조변수명 = new 클래스명(); //클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장

TV tv; //TV클래스 타입의 참조변수 tv를 선언
tv = new TV(); //TV인스턴스를 생성한 후, 생성된 TV인스턴스의 주소를 tv에 저장

 

참조변수의 인스턴스 주소는 변경 될 수 있다.

TV tv1 = new TV();
TV tv2 = new TV();

tv1 = tv2; //참조변수 tv1이 가리키던 인스턴스의 주소값이 tv2의 인스턴스의 주소값으로 바뀐다

 

객체 배열

객체를 배열로 다루는 것이 가능하며 이를 객체배열이라고 한다.

객체배열은 참조변수들을 하나로 묶은 참조 변수 배열인 것이다.

TV[] tvArray = new TV[3]; //참조변수 배열(객체 배열)을 생성

//객체를 생성해서 배열의 각 요소에 저장
tvArray[0] = new TV();
tvArray[1] = new TV();
tvArray[2] = new TV();

// or TV[] tvArray = {new TV(), new TV(), new TV()};

 

클래스의 또 다른 정의

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

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

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

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

 

 

변수와 메서드

변수

변수는 클래스변수, 인스턴스변수, 지역변수 모두 세 종류가 있다.

class Variavles
{
	int instanceVariable; //인스턴스변수
    static int classVariable; //클래스변수(static변수, 공유변수)
    
    void method(){
    	int localVariable; //지역변수
    }
}

클래스변수

- 클래스가 메모리에 올라갈 때 생성

- 선언방법은 인스턴스변수 앞에 static을 붙이면 됨

- 클래스변수는 모든 인스턴스가 공통된 저장공간(변수)을 공유 함

 

인스턴스변수

- 클래스 영역에 선언되며, 클래스의 인스턴스를 생성할 때 만들어짐

- 인스턴스를 생성해야 사용 가능

- 인스턴스는 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있음

 

지역변수

- 메서드 내에 선언되어 메서드 내에서만 사용 가능

- 메서드가 종료되면 소멸

 

메서드

- 메서드는 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것

- 메서드에 입력과 반환하는 출력만 알면 된다.(black box 라고도 함)

- 메서드는 선언부와 구현부로 이루어져 있음

 

메서드의 특징

1. 높은 재사용성

2. 중복된 코드의 제거

3. 프로그램의 구조화

 

메서드의 선언부

- 반환타입(int), 메서드이름(add), 매개변수 선언(int x, int y)로 구성

int add(int x, int y)
{
	int sum = x + y;
	return sum;
}

 

메서드의 구현부

- 메서드의 선언부 다음에 오는 괄호{}를 메서드의 구현부라고 함

 

JVM의 메모리 구조

JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 JVM은 이메모리를 용도에 따라 여러 영역으로 나누어 관리한다.

 

세 가지 주요 영역

  1. 메서드 영역(method area)
    - 프로그램 실행 중 어떤 클래스가 사용되면, 해당 클래스의 클래스파일(*.class)을 읽어 클래스에 대한 정보를 저장
    - 클레스 데이터, 클래스변수 등
  2. 호출스택(call stack 또는 execution stack)
    - 메서드의 작업에 필요한 메모리 공간을 제공 함
    - 메서드가 호출되면 수행에 필요한 만큼의 메모리(지역변수들과 연산의 중간결과 등)를 스택에 할당받음
    - 메서드가 수행을 마치고나면 사용했던 메모리를 반환하고 스택에서 제거
    - 호출스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드
    - 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드
  3. 힙(heap)
    - 인스턴스가 생성되는 공간
    - 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성
    - 인스턴스변수들이 생성되는 공간 
기본형과 참조형

기본형 매개변수: 변수의 값을 읽기만 할 수 있다.(read only)

참조형 매개변수: 변수의 값을 읽고 변경할 수 있다.(read & write)

class Data{int x;}

public class Main {

	public static void main(String[] args){
	    Data data = new Data();
	    data.x = 10;
	    System.out.println(data.x); //10
	    
	    primitiveChange(data.x);
	    System.out.println(data.x); //10 기본형 매개변수 복사
	    
	    referenceChange(data);
	    System.out.println(data.x); //1000 참조형 매개변수(주소) 복사
	}
	
	static void primitiveChange(int x) {
		x = 1000;
	}
	
	static void referenceChange(Data data) {
		data.x = 1000;
	}
}

 

배열도 객체와 같이 참조변수를 통해 데이터가 저장된 공간에 접근하기 때문에 참조 변수와 같은 결과 얻음

public class Main {
	public static void main(String[] args){
		int[] array = {10};
		array[0] = 10;
		System.out.println(array[0]); //10
		
		change(array);
		System.out.println(array[0]); //1000
		
	}
	
	static void change(int[] array) {
		array[0] = 1000;
	}
}

 

참조형 반환타입

반환타입이 '참조형'이라는 것은 메서드가 '객체의 주소'를 반환한다는 것을 의미한다.

 

재귀호출

- 메서드의 내부에서 메서드 자신을 다시 호출하는 것을 '재귀호출'이라 하고, 이를 '재귀 메서드'라 함

- 메서드의 입장에선 자신을 호출하는 것과 다른 메서드를 호출하는 것에 차이가 없음

- '메서드 호출'이라는 것이 그저 특정 위치에 저장되어 있는 명령들을 수행하는 것 뿐이기 때문

- 호출된 메서드는 '값에 의한 호출'을 통해, 원래의 값이 아닌 복사된 값으로 작업하기 때문에 호출한 메서드와 관계없이

  독립적인 작업수행이 가능

- 복잡한 코드를 재귀호출을 통해 보다 단순한 구조로 변경 가능

int factorial(int n){ //단순 반복문을 통한 함수
	int result = 1;
    
	while(n != 0)
 		result *= n--;
	reutn result;
}

int factorial(int n){ //재귀 함수
	if(n == 1) return 1;
	return n * factorial(n-1);
}

 

클래스 메서드(static메서드)와 인스턴스 메서드

클래스 메서드

- 메스드 앞에 static이 붙은 메서드

- 객체를 생성하지 않고도 '클래스이름.메서드이름(매개변수)'와 같은 식으로 호출이 가능

- 인스턴스와 관계없는(인스턴스 변수나 인스턴스 메서드를 사용하지 않는) 메서드를 클래스 메서드로 정의

 

인스턴스 메서드

- 반드시 객체를 생성해야만 호출 가능

- 인스턴스 변수와 관련된 작업을 하는, 즉 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드

- 인스턴스 변수는 인스턴스를 생성해야만 만들어지므로 인스턴스 메서드 역시 인스턴스를 생성해야만 호출 가능

 

1. 클래스를 설계할 때, 맴버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.

2. 클래스 변수(static 번수)는 인스턴스를 생성하지 않아도 사용할 수 있다.

3. 클래스 메서드(static메서드)는 인스턴스 변수를 사용할 수 없다.

4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.

 

- 클래스의 맴버변수 중 모든 인스턴스에 공통된 값을 유지해야하는 것이 있는지 살펴보고 있으면, static을 붙여준다.

- 작성한 메서드 중에서 인스턴스 변수나 인스턴스 메서드를 사용하지 않는 메서드에 static을 붙일 것을 고려한다.

 

'프로그래밍 > JAVA' 카테고리의 다른 글

[JAVA 이론] 오버로딩 & 오버라이딩  (2) 2022.01.22
[JAVA 이론] 객체지향 프로그래밍_2  (0) 2022.01.22
[JAVA 이론] 배열  (0) 2022.01.15
[JAVA 이론] 조건문과 반복문  (0) 2022.01.12
[JAVA 이론] 연산자  (0) 2021.12.28