객체 지향 프로그래밍 (Object Oriented Programming)
서론
객체 지향 프로그래밍은 세상에 존재하는 모든 것(객체) 들을 변수와 함수로 표현하려는 프로그래밍 방법론이다.
자바나 파이썬과 같이 객체지향 언어를 배워두면 문법 공부 중반쯤부터 '객체'라는 개념을 배우기 시작한다.
객체지향 언어는 객체 지향 프로그래밍을 하기 위한 언어로, 이와 반대로 존재하는 개념은 절차 지향 프로그래밍이다.
절차 지향 프로그래밍은 위에서 아래로 순차적으로 흐르는 프로그래밍 방법인데 이 방법은 컴퓨터가 작업을 처리하는 방식과 유사하기 때문에 파일 실행 시 객체 지향으로 작성한 파일보다 더 빠르게 실행을 시킬 수 있다.
대표적인 절차 지향 프로그래밍 언어로는 C언어가 있다. (C언어는 대표적인 절자 지향 프로그래밍 언어이지만 뭐 어떻게 해서 객체처럼 만들수 있다고 하긴 하더라, C언어를 안배워봐서 모름)
그렇다면 객체지향은 절차 지향 프로그래밍 방법보다 실행속도가 느린데 어째서 이 방법으로 코드를 짜는것일까?
그 이유는 프로그래밍을 편하고, 빠르게 하기 위해서이다.
하드웨어 세계에서는 컴퓨팅 환경이 많이 발전한 반면, 그에 소프트웨어 개발 속도는 하드웨어의 발전 속도를 따라오지 못하고 있었다. 그렇게 수많은 소프트웨어 엔지니어들은 개발을 더 효율적으로 하는 OOP와 여러가지 개발 방법론들을 연구하게 된다.
그 중 객체지향 방법론은 우리 개발을 하는 사람들로 하여금 개발속도를 높이고, 유지보수를 수월하게 하고, 코드의 재활용성을 높여준다.
본론
우리는 객체 지향 프로그래밍을 배우기 이전에는 그저 변수와 함수를
프로그래밍 순서대로 실행이 되도록 무분별하게 사용을 했을 뿐이었다.
클래스를 만들고, 메인함수를 만들고, 그안에 프로그램이 돌아가도록...
객체 지향 프로그래밍을 공부하고 나면 현실에 존재하는 것을
객체 단위로 묶어서 표현을 할 수 있고, 이러한 방법이 개발의 효율을 높인다는 것이다.
(컴퓨터가 파일을 실행하는 속도의 효율이 좋다는 것이 아니라, 개발자들이 코드 쓰는 속도가 빨라지고 보기 편해짐)
해당 객체를 구성하는 변수를 멤버(member), 필드(field), 속성(Attribute) 등으로 부르고,
해당 객체의 필드를 변화시킬 수 있는 객체 내부의 함수들을 메서드라고 부른다.
예) 사과
사과는 객체이다.
이 세상의 존재하는 모든 것들은 객체가 될 수 있다.
이 중 사과를 표현해낼 수 있는 것들을 변수로(변수를 이용하면 현실의 개념 사과의 속성들을 나타낼 수 있다.)
변수를 변화시키는 것들을 사과의 메서드로 표현하면 된다.
변수와 메서드
사과의 변수로는 크기, 색깔, 당도, 칼로리, 등급 등등이 들어갈 수 있겠고,
사과의 메서드로는 사과를 먹는다, 사과를 던진다, 냉장고에 보관한다 등등이 될 수 있다.
사과의 메서드로 사과를 먹는다는 것은 사과의 크기 라는 변수를 감소시키고,
사과의 칼로리를 감소시키는 행위이기도 하다.
이러한 행위를 나타내는 것을 메서드로 표현해낼 수 있다.
클래스
이러한 식으로 현실의 객체를 프로그래밍 언어로 표현한 문법이 있는데 클래스라고 부른다.
클래스는 해당 객체의 설계도 역할을 하며, 정의한 시점에는 실체가 없지만 객체를 새로 만들 때,
생성할 때 부터 실체가 생긴다.
클래스를 이용해 찍어내는 실체 객체를 '인스턴스'라고 한다. (🎁 클래스를 통해 만들어진 객체 = 인스턴스)
클래스를 이용해 인스턴스를 생성할 때에는 new 를 사용한다.
클래스는 다른파일에서 타입으로 쓸 수 있다.
모든 클래스는 참조형 (Reference variable type) 변수 타입이다. (독자적인 변수 타입이라는 말이다.)
기본형 변수 타입으로는 흔히 byte, short, int, char, float 등등이 있고,
참조형 변수 타입은 그 기본형 변수 타입을 제외한 것들
String, Scanner... (기본으로 만들어져 있는 클래스), 새로 사용자가 정의한 클래스... 등등 참조형으로 구분이 된다.
그래서 이러한 참조형 변수 타입에 붙은 변수를 참조변수라고 부른다.
기본형 타입 | 참조형 타입 |
byte, short, char, int, long, float, double, boolean | 그 외 나머지 |
클래스의 이름은 무조건 대문자로 시작해야 하며
같은 패키지 내부에는 동일한 이름의 클래스를 정의할 수 없다. (객체를 생성할 때 어느 클래스를 쫓아가야 하는지 컴퓨터가 모르기도 하고, 이런건 만든 사람만 알 수 있다. 따라서 에러메시지를 발동시킨다. 다른 패키지에 동일한 이름의 클래스를 정의한 경우 사용자가 선택할 수 있다.)
class Apple {
/*
# 인스턴스 변수
- 클래스 내부에 선언한 변수
- 각 인스턴스마다 다른 값을 가질 수 있는 변수를 의미함
- aka. 필드, 속성, 멤버, 상태
*/
int size;
int sweet;
double calorie;
String color;
/*
지금 위에 인스턴스 변수들을 선언만 하고 초기화를 안했는데,
메서드를 생성하면서 값을 넣어줄 수도 있고, 메인함수에서 값을 초기화해서 넣어줄 수도 있다.
- 실체가 생긴다는 것은 객체가 생성될 때 라는 뜻, 설계도로 만든 실체인 인스턴스가 생성될 때
이 클래스의 변수를 사용하겠다는 뜻이다.
*/
//사과에 뜬금없지만 changeColor 메소드 생성 -> this 가 꼭 필요한 경우는 언제?
//필드명과 매개변수명이 동일한 이름을 가질 때 this를 사용해 반드시 구분해줘야 한다.
//(이러한 경우가 굉장히 많음)
void setColor(String color) {
this.color = color;
}
/*
# 인스턴스 메서드
- 클래스 내부에 선언한 함수
- 주로 해당 인스턴스 변수를 변화시키는 역할을 한다.
# this
- 현재 인스턴스 자기 자신을 가리키는 문법
- 생략이 가능하다, 호출 한 놈이 누구냐에 따라 this는 달라질 수 있음
- this를 꼭 써야하는 경우?? => 매개변수의 변수명과 인스턴스 변수명이 같을 때
*/
void eat() {
this.size--; // (this가 생략)
this.calorie -= 5;
}
void info() {
System.out.println(" - - - 이 사과의 정보 - - - ");
System.out.println("크기\t: " + size);
System.out.println("당도\t: " + sweet);
System.out.println("칼로리\t: " + calorie);
System.out.println("색깔\t: "+ color);
}
}
Apple, 사과 객체를 정의함
// 전제 : 위의 사과 클래스랑 같은 클래스 내부임
public class OOP {
public static void main(String[] args) {
//main을 작성한 후 [ctrl + space] 단축키를 이클립스에서 해보세요
// 사과 클래스로 사과 인스턴스를 생성 (설계도로 만든 실체를 인스턴스라고 한다, 객체)
Apple a1 = new Apple(); // 이 시점에서 사과의 실체가 생겼다.
Apple a2 = new Apple(); // 사과농장에서 각기 다른 두 개 사과가 생겼음
// .을 찍어서 해당 인스턴스의 필드값을 사용할 수 있다
a1.size = 20;
a1.sweet = 8;
a1.calorie = 200.0;
a1.color = "빨간색";
for (int i = 0; i < 5; ++i) {
a1.eat();
}
a2.eat();
//sysout + ctrl + space
System.out.println("a1의 size : " + a1.size);
System.out.println("a1의 당도 : " + a1.sweet);
System.out.println("a2의 칼로리 : " + a1.calorie);
System.out.println("a2의 칼로리 : " + a2.calorie);
a2.setColor("Black");
a1.info();
a2.info();
}
}
'Java (국비지원 당시 공부했던 글) > OOP (Java)' 카테고리의 다른 글
[자바] OOP - 5. 상속 (객체의 다형성과 캐스팅) (0) | 2022.05.30 |
---|---|
[자바] OOP - 4. 상속 (상속 개념과 super, 오버라이드) (0) | 2022.05.27 |
[자바] OOP - 3. static과 변수 선언위치, 생성시기 (0) | 2022.05.16 |
[자바] OOP - 2. 클래스의 생성자와 오버로딩 (0) | 2022.05.16 |
[자바] 메소드란? (메소드, 리턴, 인자, 매개변수) (0) | 2022.04.26 |