2023. 4. 21. 16:24ㆍCode
객체지향 프로그래밍 기초
OOP = 객체지향 프로그래밍
클래스 = 틀 ==> 클래스로 생성하는것 객체
모든 실재하는 어떤 대상 을 프로그래밍 언어에서는 객체 라고 부른다
객체는 우리가 보고 느끼고 인지할 수 있는 모든 것을 의미한다
객체지향 프로그래밍 개념은 객체로 부터 시작한다
객체지향프로그래밍
- 실제 세계는 이러한 객체들로 구성되어 있으며, 발생하는 모든 사건들은 이 객체들 간의 상호작용을 통해 발생한다
- 일련의 명령어들의 나열을 통해 컴퓨터에게 말을 건네는 절차적 프로그래밍 방식과는 다르다
- 프로그래밍에서 필요한 데이터를 한 데 모아 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 협력과 유기적인 상호작용을 통해 특정기능을 구성 하는 것 이다
- 실제 사물의 속성과 기능을 분석한 후에 이것을 프로그래밍의 변수와 함수로 정의함으로 실제 세계를 최대한 컴퓨터 프로그래밍에 반영하고자 하는 시도 이다
- 기존 코드를 재활용 할 수 있다. 때문에 적은 노력으로도 쉽게 코드를 변경할 수 있게 한다
- 프로그램 개발 및 유지보수에 드는 비용과 시간을 획기적으로 줄일 수 있고, 객체를 통해 데이터를 관리하여 데이터를 손실없이 관리하기에 용이 하다
- 객체 = 실재하는 모든 것 , 사용할 수 있는 실체
클래스 와 객체
클래스
- 객체를 정의한 '설계도' , '틀'
- 객체를 생성하는데 사용된다
- 객체는 클래스에 정의되고 설계된 내용 그대로 생성 된다
## 클래스는 객체 그 자체가 아니라 단지 객체를 생성하는데 사용되는 하나의 틀 ##
- 클래스를 통해 생성된 객체를 해당 클래스의 인스턴스라 부른다, 클래스로 부터 객체를 만드는 과정을 '인스턴스화' 라고 지칭한다
- 객체는 모든 인스턴스를 포괄하는 의미
- 인스턴스는 해당 객체가 어떤 클래스로부터 생성된 것인지 강조
클래스의 구성요소와 기본 문법
class 클래스명 { //클래스 정의
}
- 클래스명은 주로 대문자로 시작한다
- 필드 ( field ), 메서드 ( method ) , 생성자 ( comstrctor ) , 이너 클래스 ( inner class ) 로 구성되어 있다
public class ExampleClass {
int x = 10; // (1)필드
void printX() {...} // (2)메서드
ExampleClass {...} // (3)생성자
class ExampleClass2 {...} // (4)이너 클래스
}
- 필드 : 클래스의 속성을 나타내는 변수
- 매서스 : 클래스의 기능을 나타내는 함수
- 생성자 : 클래스의 객체를 생성하는 역할
- 이너 클래스 : 클래스 내부의 클래스를 의미
- 생성자를 제외한 나머지 3가지 요소 ( 필드 , 메서드, 이너클래스 ) 를 클래스의 ' 맴버 ' 라고 한다
- ' 필드 ' 와 ' 메서드 '는 각각의 클래스가 가지는 속성 ( state ) 과 기능 ( behavir ) 을 대표 한다
- 속성과 기능은 해당 클래스와 관련된 데이터의 집합이다 ( 핵심 정보를 담고 있다 )
객체 ( Object )
- ' 속성' 과 ' 기능' 의 두 가지 요소로 이루어져 있다
- 속성 = 필드 , 기능 = 메서드
- 일반적으로 하나의 객체는 다양한 속성과 기능의 집합으로 이루어져 있다
- 속성과 기능은 이너 클래스와 함께 객체의 ' 맴버 ' 라고 부른다
- 객체의 생성은 new 키워드를 사용하여 생성한다
- 생성 후에는 포인트 연산자(.)를 통해 해당 객체의 맴버에 접근이 가능하다
객체의 생성과 활용
객체의 생성
- new 키워드로 생성할 수 있다
클래스명 참조_변수명; // 인스턴스를 참조하기 위한 참조변수 선언
참조_변수명 = new 생성자(); // 인스턴스 생성 후, 객체의 주소를 참조 변수에 저장
- 참조 변수는 실제 데이터 값이 아니라 실제 데이터가 저장되어 있는 ' 힙 메모리의 주소값 ' 을 가르킨다
- new 키워드는 생성된 객체를 힙 메모리에 넣으라는 의미, 생성자(클래스와 동일한 이름을 가졌지만 뒤에 소괄호가 붙음)를 통해 객체가 만들어지면 해당 객체를 힙 메모리에 넣는 역할을 수행하게 된다
클래스명 참조_변수명 = new 생성자();
- 위 과정은 줄여서 한줄로 선언 가능
## 참조_변수 = 실제 데이터 값을 저장하는 것이 아니라 실제 데이터가 위치해 있는 힙 메모리의 주소를 저장하는 변수를 의미 ##
- new 키워드와 생성자를 통해 클래스의 객체를 생성한다는 것은 해당 객체를 ' 힙 메모리 ' 에 넣고 그 주소값을 참조변수에 저장하는 것
객체 생성 코드
Person P = new person();
클래스 참조_변수 생성자 ===> 객체
(출력)
클래스영역에 저장 스택영역에 저장 힙 메모리에 저장 힙 메모리 영역(필드, 메서스, 이너클래스)
(인스턴스 메서드 영역) - 메서드
- 클래스 는 클래스 영역에 저장 , 참조변수는 스택영역에 저장
- 생성자로 만들어진 인스턴스는 힙메모리 영역에 들러가며 객체 내부에서는 클래스의 맴버들이 위치하게 된다
- 같은 클래스로 만든 모든 객체는 동일한 메서드 값을 공유하기 때문에 여러 번 같은 메서드를 선언해 주는 것이 아니라 한번만 저장해 두고 필요한 경우에만 클래스 영역에 정의된 메서드를 찾아 사용할 수 있다
- 생성된 객체에서 필드값은 실제 저장공간이 객체 내부에 있다는 것, 메서드는 다른 영역에 하나만 저장해 놓고 공유하는 점 ## 기억! ##
객체의 활동
- 객체에 접근하고 사용하는 방법은 포인트연산자(.)로 가능하다 그 의미는 해당위치에 있는 객체 안을 보세요 라는 뜻을 가지고 있다
참조 변수명.필드명 // 필드값 불러오기
참조 변수명.메서드명() // 메서드 호출
인스턴스 변수 클래스 변수
생성시점 인스턴스가 생성될때 만들어진다 프로그램이 실행될 때 이미 만들어져 있다.
ex. new 생성자()
사용가능 시점 인스턴스가 생성된 후에 사용할 수 있다. 인스턴스를 생성하기 전에도 사용할 수 있다.
생성공간 힙 메모리의 인스턴스 내 클래스 영역의 클래스 코드 내
용도 객체의 고유한 속성 저장 객체간 공유 속성 저장
필드 ( Field )
- 클래스에 포함된 변수 를 의미한다
- ' 클래스 변수 ' ' 인스턴스 변수 ' '지역 변수 ' 세가지로 구분된다
- 필드라 부르는 것은 ' 클래스 변수 ' , ' 인스턴스 변수 ' 이며 이 두가지를 다시 static 키워드의 유무로 구분할 수 있다
- static 키워드가 함께 선언된 것은 클래스 변수
- static 키워드가 없는 것을 인스턴스 변수
- 위 두가지 변수유형에 포함되지 않고 메서드 내에 포함된 모든 변수를 지역 변수 라 한다
class Example { // => 클래스 영역
int instanceVariable; // 인스턴스 변수
static int classVariable; // 클래스 변수(static 변수, 공유변수)
void method() { // => 메서드 영역
int localVariable = 0; // 지역 변수. {}블록 안에서만 유효
}
}
- instanceVariable과 classVariable은 클래스 영역에 선언되었기 때문에 멤버 변수이다
- 인스턴스 변수(iv)는 인스턴스가 가지는 각각의 고유한 속성을 저장하기 위한 변수로 new 생성자()를 통해 인스턴스가 생성될 때 만들어 진다
- 클래스를 통해 만들어진 인스턴스는 힙메모리의 독립적인 공간에 저장되고 동일한 클래스로부터 생성되었지만 객체의 고유한 개별성을 가진다
- static 키워드를 통해 선언하는 클래스 변수는 독립적인 저장 공간을 가지는 인스턴스 변수와 다르게 ' 공통된 저장공간은 가진다 '
- 클래스 변수는 인스턴스 변수와 달리 인스턴스를 따로 생성하지 않고도 언제라도 클래스명.클래스변수명 을 통해 사용이 가능하다
Ex. Example.classVariable로 클래스 변수를 사용할 수 있다
- 지역변수는 메서드 내에 선언되며 메서드 내({} 블록)에서만 사용가능한 변수이다
- 지역변수는 스택 메모리에 저장되며 메서드가 종료되는 것과 동시에 함께 소멸되어 더 이상 사용할 수 없게 된다.
- 힙 메모리에 저장되는 필드 변수는 객체가 없어지지 않는 한 절대로 삭제되는 않는 반면, 스택 메모리에 저장되는 지역변수는 한동안 사용되지 않는 경우 가상 머신에 의해 자동으로 삭제된다
- 필드 변수와 지역 변수의 차이점은 ' 초기값 ' 에 있다
- 직접 초기화하지 않으면 값을 출력할 때에 오류가 발생하는 지역 변수와 다르게 필드 변수는 직접적으로 초기화를 실행하지 않더라도 강제로 초기화가 이루어 진다
- 힙 메모리에는 빈 공간이 저장될 수 없기 때문에 이곳에 저장되는 필드는 강제로 초기화되지만, 스택 메모리는 강제로 초기화되지 않으므로 지역 변수는 선언 시 반드시 초기화를 실행해주어야 한다
- 힙 메모리 영역 = 필드 변수 저장 / 스택 메모리 영역 = 지역 변수 저장
static 키워드
- 클래스 변수와 인스턴스 변수를 구분하기 위한 방법으로 static 키워드의 유무를 확인한다
- static 는 클래스의 맴버 ( 필드, 메서드, 이너 클래스 ) 에 사용하는 키워드 이다
- static 키워드가 붙어있는 맴버를 ' 정적 멤버 ' 라고 부른다
- static 가 붙어 있지 않은 인스턴스 변수와 구분한다
- 반드시 객체를 생성한 이후에 변수와 메서드에 접근하여 해당 멤버를 사용가능한 반면, static 키워드로 정의되어 있는 클래스 멤버들은 인스턴스의 생성 없이도 클래스명.멤버명 만으로도 사용이 가능하다는 점이다
- new 키워드를 통해 생성된 인스턴스는 힙 메모리에 생성되고 독립적인 저장공간을 가지게 된다
반면 static 키워드로 선언된 정적 멤버는 클래스 내부에 저장 공간을 가지고 있기 때문에 객체 생성 없이 곧바로 사용할 수 있다.
- 정적 필드는 객체 간 공유 변수의 성질이 있다는 점이다.
- 일반적인 메서드 앞에 static 키워드를 사용하면 해당 메서드는 정적 메서드가 된다, 정적 메서드도 정적 필드와 마찬가지로 클래스명만으로 바로 접근이 가능하다
- 정적 메서드의 경우 인스턴스 변수 또는 인스턴스 메서드를 사용할 수 없다
- 적 메서드는 인스턴스 생성 없이 호출이 가능하기 때문에 정적 메서드가 호출되었을 때 인스턴스가 존재하지 않을 수 있기 때문이다
메서드 (Method)
- 특정 작업을 수행하는 일련의 명령문들의 집합 을 의미한다
- 클래스의 기능에 해당하는 내용을 담당한다
Ex.
자바제어자 반환타입 메서드명(매개 변수) { // 메서드 시그니처
메서드 내용 // 메서드 바디
}
void power() { // 메서드 선언
System.out.println("시동을 걸었습니다.");
}
- 해당 메서드가 어떤 타입을 반환하는가 ( 반환 타입 ) , 메서드 이름이 무엇 ( 메스더명 ) 이며 해당 작업을 수행하기 위해서 어떤 재료들이 필요 한지 ( 매개 변수 )에 대한 정보를 포함하고 있다.
- 메서드 명은 관례적으로 소문자를 사용한다
public static int add(int x, int y) { // 메서드 시그니처
int result = x + y; // 메서드 바디
return result;
}
메서드 명이 add이며 int 타입 2개의 값 (x 와 y)을 받아 더한 다음 int 타입의 결과값을 반환하는 메서드 이다
## 만약 메서드의 반환 타입이 void가 아닌 경우에는 메서드 바디 {} 안에 반드시 return문이 존재 해야 한다 ##
- 리턴문은 작업을 수행한 결과값을 호출한 메서드로 전달한다
- 결과값은 반드시 반환타입과 일치하거나 적어도 자동형변환이 가능한 것 이어야 한다
int getNumSeven() { // 매개변수가 없는 메서드
return 7;
}
- getNumSeven 메서드는 int 타입의 결과값을 반환하는 매개변수가 없는 메서드입니다. 해당 메서드가 호출되면 그냥 숫자 7을 반환하면 되기 때문에 따로 매개변수가 필요없다
Double multiply(int x, double y) { // 매개변수가 있는 메서드
double result = x * y;
return result;
}
- 매개변수 x와 y를 전달받아 반환 타입이 double인 result를 반환하는 매개변수가 있는 메서드 이다
( int 와 double형을 산술 연산하면 범위가 더 큰 타입으로 자동 변환 된다 )
메서드의 호출
- 메서드도 클래스의 맴버이므로 클래스 외부에서 메서드를 사용하기 위해서는 먼저 인스턴스를 생성해야 한다
- 인스턴스를 생성한 후 포인트연산자(.)를 통해 메서드를 호출할 수 있습니다
- 클래스 내부에 있는 메서드 끼리는 따로 객체를 생성하지도 않고도 서로를 호출할 수 있다
메서드이름 ( 매개변수1, 매개변수2 ...);
- 메서드 호출 시 괄호()안에 넣어주는 입력 값을 우리는 ' 인자 ' (argument) 라고 하는데, 인자의 갯수와 순서는 반드시 메서드를 정의할 때 선언된 매개변수와 일치되어야 한다
메서드 오버로딩 ( Method Overloading )
- 하나의 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것을 의미 한다
- 하나의 메서드에 하나의 기능만을 구현해야 하는데 같은 이름의 메서드를 여러 기능을 구현하기 때문에 오버로딩이라 한다
- 무조건 같은 메서드명을 사용한다고 해서 오버로딩이 되는 것이 아니다
오버로딩이 성립하기 위해서는 2가지 조건이 필요하다
1. 같은 이름의 메서드명을 사용해야한다
2. 매개면수의 갯수나 타입이 다르게 정의 되어야 한다
- 반환 타입은 오버로딩이 성립하는데에 영향을 주지 못한다
- 하나의 메서드로 여러 경우의 수를 해결할 수 있다
메서드 시그니처 ( Method signature )
- 메서드 시그니처는 메서드명과 매개변수의 타입을 의미한다
Javs 실행과정 - 컴파일, 러닝
- 컴파일을 하고 그 결과를 가지고 러닝을 한다
- .Javs 에서 .class 파일로 변경 ==> 클래스 로더가 .class 파일을 가져와 JVM으로 옮긴다
- main이 실행이 될때 ==> 런타임으로 들어간다
-
static을 사용한 클래스 변수은 공유!!! car1 car2 car3를 만들었었도 내용은 모두 똑같이 공유한다!
인스턴스변수는 따로따로 각자!!
- 생성자는 초기화를 시켜준다
'Code' 카테고리의 다른 글
2023.04.25 코드스테이츠 11일차. (0) | 2023.04.25 |
---|---|
2023.04.24 코드스테이츠 10일차. (0) | 2023.04.24 |
2023.04.20 코드스테이츠 8일차. (0) | 2023.04.20 |
2023.04.19 코드스테이츠 7일차. (0) | 2023.04.20 |
2023.04.18 코드스테이츠 6일차. (1) | 2023.04.18 |