[Java] 객체지향 개념 (1)

2021. 7. 19. 21:36Java

객체지향에 관련하여 두 개의 포스팅으로 나누어 정리할 예정입니다.

 

객체지향 프로그래밍이란?(OOP, Object Oriented Programming)

객체지향은 현실을 상태와 행동을 가진 객체로 나누고 그 객체간의 상호관계를 맺어줌으로써 개발하는 프로그래밍 기법중 하나입니다.

비슷하게 컴퓨터를 예를 들 수 있습니다.

컴퓨터는 CPU, 하드디스크, 메모리, 메인보드 등의 수많은 부품들로 구성되며, 각자의 부품은 고유의 기능들이 있습니다.

여기서 부품들을 하나의 객체로 보고 컴퓨터를 하나의 프로그램이라고 본다면, 각각의 부품들을 서로 조립함으로써 하나의 컴퓨터라는 프로그램을 완성할 수 있다고 볼 수 있습니다.

사용자의 입맛에 맞게 부품을 업그레이드할 수 있고 만약 컴퓨터가 고장이 난다면, 고장난 부품만 따로 교체하여 유지보수할 수 있습니다.

 

객체지향 언어란?

객체지향 언어란 기본적인 프로그래밍 언어에 객체지향 개념이 추가된 것입니다.

대표적으로 C++, Java, Python 세가지 언어가 있습니다.

객체지향 언어는 코드의 재사용성이 높고 유지보수에 용이하며 중복 코드 제거에 유리한 장점이 있습니다.

 

OOP의 핵심 개념

  1. 캡슐화
  2. 상속
  3. 추상화
  4. 다형성

4가지 핵심 개념은 두 번째 포스팅에서 집중적으로 다루겠습니다.

(캡상추다...)


클래스란?

클래스는 객체를 정의해놓은 설계도라고 할 수 있습니다.

클래스는 크게 클래스 영역과 메서드 영역으로 나뉘며, 클래스 영역에는 주로 인스턴스 변수(iv), 클래스 변수(cv)가 선언되고 메서드 영역에는 지역 변수(lv)가 선언됩니다.

 

객체란?

객체는 속성(변수)와 기능(메서드)으로 이루어진 실제로 존재하는 것입니다.

java에서는 객체를 인스턴스(instance)라고 부릅니다.

주로 책에선 객체는 붕어빵, 클래스는 붕어빵틀에 비유하여 설명합니다.

 

다음은 클래스를 이루는 변수와 메서드, 생성자에 대해서 알아보겠습니다.


변수란?

변수는 데이터를 저장할 공간에 이름을 붙인 것입니다.

메모리위에서 데이터를 다루기 위해선 데이터의 메모리 주소를 알아야 하는데, 이들을 일일이 0x100, 0x200, 0x300...로 부를 수 없으니 외우기 쉽도록 변수라는 이름을 붙인 것입니다.

 

Java 클래스에서 다루는 변수의 종류는 아래와 같습니다.

  1. 클래스 변수 cv: 클래스가 메모리에 올라갈 때 생성되는 변수(static)
  2. 인스턴스 변수 iv: 인스턴스가 생성되었을 때 생성되는 변수
  3. 지역변수 lv: 변수 선언문이 수행되었을 때 생성되는 변수

변수의 타입으로는 기본형 타입과 참조 타입으로 나눌 수 있습니다.

기본형(primitive type)

primitive type은 byte, short, int, long, float, double, char, boolean이 있습니다.

변수에 실제값(리터럴)을 저장합니다.

참조형(reference type)

reference type은 기본형을 제외한 모든 타입을 말하며 String, System, List 등이 있습니다.

참조형 타입 변수에는 heap 영역에 존재하는 객체의 주소값이 저장됩니다.


메서드란?

메서드는 값을 입력 받아서 결과를 반환하는 것을 말합니다.

메서드를 사용하면 코드의 중복을 줄이고 메서드를 호출함으로써 코드를 재사용할 수 있습니다.

 

호출 스택이란?

java로 작성한 프로그램이 메모리에 올라와서 실행되면 main() 메서드부터 실행되고 코드 위에서부터 순차적으로 호출된 메서드들이 호출 스택에 차곡차곡 쌓입니다.

호출이 끝나면 맨위 메서드부터 차례로 실행하고 그 밑의 메서드들은 대기합니다.

제일 나중에 올라온 메서드가 제일 먼저 처리되는 식으로 프로그램이 진행되기 때문에 호출 스택은 LIFO 영역이라고도 불립니다.(Last In First Out)

메서드의 매개 변수의 타입은 크게 primitive type과 reference type으로 나눌 수 있습니다.

 

기본형 매개변수(primitive type)

메서드의 매개변수로 해당 타입 변수가 선언되있으면, 입력받는 매개변수는 복사된 값을 가지며 read only의 속성을 가집니다.

class Data { int x; }

class Ex {
	static void change(int x) { // 기본형 매개변수이므로 복사된 값을 사용함
    	x = 1000;
    }

	public static void main(string[] args) {
    	Data data = new Data();
        data.x = 10;
        
        change(x); // 메서드를 수행해도 복사된 값이 변한 것이기 때문에 기존의 x는 변함 없다.
        System.out.println(data.x); // 10
    }
}

참조형 매개변수(reference type)

입력받은 참조형 매개변수는 객체의 주소값을 받고 함수 내부에서 객체를 읽고 쓰기가 가능하여 read & write 속성을 가집니다.

class Data2 { int x; }

class Ex {
	static void change(Data2 d) { // 참조형 매개변수이므로 d는 객체의 주소를 가리킨다.
    	d.x = 1000;
    }

	public static void main(string[] args) {
    	Data2 data = new Data2();
        data.x = 10;
        
        change(data); // 메서드가 수행되면 객체의 성분 x가 바뀐다.
        System.out.println(data.x); // 1000
    }
}

 

오버로딩이란?(Overloading)

오버로딩은 하나의 클래스안에서 같은 이름의 메서드를 여러개 선언하는 것을 말합니다.

단, 메서드의 매개변수의 개수나 순서 또는 타입이 달라야 합니다.

class Math {
	int add(int x, int y) {
    	// 구현부 생략
    }
    
    long add(long x, long y) {
    	// 구현부 생략
    }
    
    int add(int[] x) {
    	// 구현부 생략
    }
}

생성자란?(Constructor)

생성자는 인스턴스가 생성될 때마다 호출되는 인스턴스 초기화 메서드입니다.

객체는 어떻게 보면 iv들의 모음이고 객체가 매번 생성될 때마다, 각각의 iv에 개발자가 의도한 초기값을 대입해주어야 합니다.(아니면 전부 default값이 자동으로 대입됨)

생성자를 선언할 때는 클래스의 이름과 같게 선언해야하고 모든 클래스는 반드시 하나 이상의 생성자를 가져야 합니다.

iv를 초기화할 때는 생성자를, cv를 초기화할 때는 static{} 블록을 사용합니다.

 

 

 

Ref.

https://www.zerocho.com/category/JavaScript/post/597f34bbb428530018e8e6e2

 

(JavaScript) 호출 스택과 이벤트루프

안녕하세요. 이번 시간에는 호출 스택과 이벤트루프에 대해서 알아보겠습니다! 정말 오랜만에 자바스크립트 파트 강좌를 올리네요. 사실 웬만한 것들은 다 다뤘다고 생각해서 50강으로 끝내려

www.zerocho.com

https://www.youtube.com/playlist?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp 

 

자바의 정석 기초편(2020최신)

최고의 자바강좌를 무료로 들을 수 있습니다. 어떤 유료강좌보다도 낫습니다.

www.youtube.com

 

'Java' 카테고리의 다른 글

[Java] 컬렉션 프레임워크 (3)  (0) 2021.07.28
[Java] 컬렉션 프레임워크 (2)  (0) 2021.07.27
[Java] 컬렉션 프레임워크 (1)  (0) 2021.07.26
[Java] 추상 클래스와 인터페이스  (0) 2021.07.21
[Java] 객체지향 개념 (2)  (0) 2021.07.20