포스트

자바 : OOP : 클래스와 오브젝트 / 필드와 메서드


객체지향 프로그래밍(Object - Orientied Programming)

  • 코드들의 결합도를 합리적인 수준까지 낮춘다.
  • 코드들의 상호연관성을 최대한 낮춘다.
  • 결합도를 낮춰 오류 상황에서 효율적으로 처리할 수 있도록하기 위한 최적의 방법
  • 코드가 변화와 확장에 유연해진다.


프로그래밍에서 필요한 데이터를 한 데 모아 추상화시켜 상태와 행위를 가진 객체를 만들고

그 객체들 간의 협력과 유기적인 상호작용을 통해 특정 기능을 구성하는 프로그래밍 방법론

그러니까 쉽게 말해서 본래 사람 몸은 팔, 다리, 머리, 장기가 분리 안되잖음?

근데 이게 탈착식으로 뺏다 꼇다 필요한 팔 꼇다 뺐다 필요한 머리 뺐다 꼈다 된다는거임 > 이게 객체지향

딱 한마디로 “객체지향은 호빵맨이다.”


클래스

같은 종류의 집단에 속하는 속성(attribute)과 행위(behavior)를 정의한 것 / user defined data type

  • 객체를 정의한 ‘설계도(blueprint)’ 또는 ‘틀(frame)’이라 정의
  • 객체를 생성하는데 사용 / 객체는 클래스에 정의되고 설계된 내용 그대로 생성
    ex) 제품의 설계도와 제품과의 관계
    클래스를 통해 생성된 객체 ~~> 인스턴스(instance) : 이 과정을 인스턴스화(instantiate)라고함
  • 일반적으로 하나의 소스 파일에는 하나의 클래스만 생성하는 것을 권장함


클래스를 이용하여 객체를 만드는 방법

<클래스명> <변수명> = new <클래스명>();
### 클래스의 구성요소 필드(field) / 메서드(method) / 생성자(constructor) / 이너 클래스(inner class) - 필드 : 클래스의 속성을 나타내는 변수 / 자동차로 예를 들면 모델명, 컬러, 바퀴의 수 등이 포함 - 메서드 : 클래스의 기능을 나타내는 함수 / 자동차를 예로 들면 시동하기, 가속하기, 정지하기 등이 포함 => 필드와 메서드는 각각의 클래스가 가지는 속성(state)와 기능(behavior)을 대표 (속성과 기능은 해당 클래스와 관련된 데이터의 집합 즉, 합쳐서 객체를 뜻함) - 생성자 : 클래스의 객체를 생성하는 역할 (new) - 이너 클래스 : 클래스 내부의 클래스를 의미 => 생성자 제외한 세가지를 클래스의 멤버(member)라 부름
### 필드(Field) - 클래스를 구성하는 요소 중 하나로 클래스 내부 멤버 - 어떠한 데이터를 저장하기 위한 역할을 담당 - 클래스 내부의 생성자와 메소드 밖에 정의 - 멤버변수(member variable) or 전역 변수 - 즉 필드란 클래스 안에서 독립적으로 선언되는 변수
![](/assets/img/bootcamp/classset.png) 출처 : 위키 해시
### 객체 무언가에 대한 정보와 동작을 묶어놓은 것 ex) 사람 정보 | 이름, 나이, 성별 ... 등 동작 | 밥먹기, 잠자기 , 운동하기 ... 등 정보 => 필드 == 변수 동작 => 메소드 - 클래스의 인스턴스(실제로 메모리상에 할당된 것) == 클래스(class)가 실제로 구현된 인스턴스(instance) - 자신 고유의 속성(attribute)을 가지며 클래스에서 정의한 행위(behavior)를 수행 - 모든 인스턴스를 대표하는 포괄적인 의미 - 속성과 기능의 집합 속성으로는 멤버변수, 특성, 필드, 상태 / 기능으로는 메소드, 행위, 함수
### 인스턴스 객체와 비슷한 의미를 지니지만 엄밀히 따지면 해당 객체가 어떤 클래스로부터 생성된 것인지를 강조 ex) 집 설계도(Class)로 집을 만듬(객체이자 인스턴스)
![](/assets/img/bootcamp/objectpic.png) 출처 : 위키 해시
### 메소드(Method) 클래스로부터 생성된 객체를 사용하는 방법. 객체에 명령을 내리는 메시지 - 클래스(class) 내부에 정의된 함수(函數, function)를 말함. 즉, 클래스 멤버 함수임 - 프로그램이 실행되고 있을 때 클래스에서 생성된 인스턴스와 관련된 동작을 정의 - 특정 작업을 수행하는 일련의 명령문들의 집합
### 메소드 형태 머리에 해당하는 메서드 시그니처(method signature) 몸통에 해당하는 메서드 바디(method body); ``` 자바제어자 반환타입 메서드명(매개 변수) { // 메서드 시그니처 메서드 내용; // 메서드 바디 } ``` ★ 메서드명은 관례적으로 소문자로 표시 ★ void : 반환 값이 없는 메서드 (간단하게 return문이 필요 없다는 뜻) => 반대로 메서드의 반환타입이 void가 아닌 경우에는 메서드 바디({} )안에 반드시 return 문이 존재해야 함 // 리턴문은 작업을 수행한 결과값을 호출한 메서드로 전달, 결과값은 반드시 반환타입과 일치하거나 적어도 자동 형변환이 가능한 것이어야 함
### 클래스 메소드 객체를 생성하지 않고 호출이 가능 메소드 내부에서 인스턴스 변수를 사용할 수 없다
### 인스턴스 메소드 메소드의 작업 수행 시 인스턴스 변수가 필요한 메소드 인스턴스 변수는 객체를 생성해야 만들어지기 때문에 인스턴스 메소드가 인스턴스를 생성해야만 호출할 수 있다
### 메소드 용법 메서드 = 클래스 멤버 클래스 외부에서 메서드를 사용하기 위해서는 먼저 인스턴스를 생성 . (포인트 연산자)를 이용하여 클래스에서 필요한 메소드 호출
### 메소드 정의 1. 메소드의 역할을 정확히 정한다 2. 메소드의 입출력을 정한다 3. 메소드의 시그니처를 정의한다. 4. 메소드의 바디를 정의한다.
### new 생성자 1. 클래스명 참조_변수명; // 인스턴스를 참조하기 위한 참조변수 선언 2. 참조_변수명 = new 생성자(); // 인스턴스 생성 후, 객체의 주소를 참조 변수에 저장 => <클래스명> <참조_변수명> = new 생성자 <클래스명>(); ★ new 키워드는 생성된 객체를 힙 메모리에 넣으라는 의미
### static 키워드 static은 클래스의 멤버(필드, 메서드, 이너 클래스)에 사용하는 키워드 static 키워드가 붙어있는 멤버 == 정적 멤버(static member) ! 안 붙어있으면? > 인스턴스 변수 ! 붙어있으면 > 클래스 변수
### static 키워드 용법 인스턴스 멤버 -> 객체 생성 -> 변수와 메서드에 접근 -> 사용 static 멤버 -> <클래스명>.<멤버명> -> 사용 ! 정적 멤버도 객체를 생성한 이후 참조변수를 통해 사용이 가능하긴 함 그러나, 정적 멤버임을 표시하기 위해 클래스명.멤버명 의 형태로 사용할 것을 권장 ! 정적 필드는 객체 간 공유 변수의 성질이 있다 정적 메서드도 정적 필드와 마찬가지로 클래스명만으로 바로 접근이 가능 정적 메서드의 경우 인스턴스 변수 또는 인스턴스 메서드를 사용할 수 없다
### 변수 자바의 변수는 1. 클래스 변수(cv, class variable) ~> 필드 2. 인스턴스 변수(iv, instance variable) ~> 필드 3. 지역 변수(lv, local variable) ~> 메소드 내 ~> 여기 두 가지에 포함되지 않고 메소드 내에 포함된 모든 것을 로컬 변수 ★ 여기서 Static 키워드 선언 시 ~> 클래스 변수 / 안한 건 인스턴스 변수 ```java public class fieldExam { // ~> 클래스 영역 int instanceVariable; // ~> 인스턴스 변수 static int classVariable; // ~> 클래스 변수(=static 변수, 공유 변수) void method() { // ~> 메소드 영역 int localVariable = 0; // 지역 변수. ~> {}블록 안에서만 유효 } } ``` => 인스턴스 변수와 클래스 변수는 클래스 영역에 선언되어서 클래스 멤버 변수
### 인스턴스 변수(iv) 각각의 고유한 속성을 저장, new 생성자() 를 통해 인스턴스가 생성될 때 만들어 짐 고유한 특성을 정의하기 위한 용도
### 클래스 변수(cv) 공통된 저장공간을 공유 한 클래스로부터 생성되는 모든 인스턴스 들이 특정한 값을 공유해야하는 경우 static 키워드를 사용하여 클래스 변수를 선언 ~> static 붙은건 클래스 변수 클래스 변수는 인스턴스 변수와 달리 인스턴스를 따로 생성하지 않고도 언제라도 <클래스명>.<클래스변수명> 을 통해 사용이 가능
### 지역변수(lv) 메서드 내에 선언되며 메서드 내({} 블록)에서만 사용가능 스택 메모리에 저장되어 메서드가 종료되는 것과 동시에 함께 소멸 ==> 필드 변수와 지역 변수의 주요한 한 가지 차이점 = 초기값 클래스 멤버 변수를 sout으로 불러오면 주소값이 나옴, 이 주소값은 실제 데이터 값이 아니라 실제 데이터가 저장되어 있는 힙 메모리의 주소값 즉 해당 변수는 참조 변수
### 자바의 구동 원리 ``` 코드 작성 ↓ javac로 컴파일 ↓ --------------------> 여기부터는 JVM 로더로 들어감 ↓ 런타임 데이터 에어리어 ↓ 실행 ``` 이때 Runtime Data Area는 클래스 영역(클래스 변수) | 스택 영역(지역 변수) | 힙 영역(인스턴스 변수) 으로 나뉨 인스턴스 변수 : 인스턴스 생성 시 만들어짐 | 인스턴스 생성 후 사용 가능 | 힙 메모리 인스턴스 내 생성 | 객체의 고유한 속성 저장 클래스 변수 : 프로그램이 실행될 때 이미 만들어짐 | 인스턴스 생성 전후 사용 가능 | 클래스 영역의 클래스 코드 내 생성 | 객체 간 고유 속성 저장 => 걍 쉽게 말하면 인스턴스 변수는 메인 객체 안에 new 연산자로 인스턴스 생성 하고서만 쓸 수 있고 클래스 변수는 static 키워드 붙이고 인스턴스 생성 여부랑 관련 없이 바로 쓸 수 있다는 얘기 쉽게 말해 힙 메모리에는 빈공간 저장 X 그래서 필드 변수인 클래스 변수와 인스턴스 변수는 선언하면 힙 메모리에 저장되면서 바로 강제 초기화됨. 반대로 로컬 변수는 휘발성이라 스택 메모리에 선언되어도 저장이 안되서 초기화를 사용자가 직접해야함 별도의 클래스에 객체 정의하고 메인 클래스(즉, 아웃풋 실행할 메인 클래스)에 new 연산자 넣고 인스턴스 생성 후 요소 입력 그러니까 1번 클래스에는 직접적인 값 입력 없이 정의만 하고 메인 클래스에 해당 클래스를 참조 변수로 불러와서 new 연산자 넣고 하나를 힙 메모리의 다른 영역에 복제하는 것
### 메서드 오버로딩(Method Overloading) 하나의 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것 무조건 같은 메서드명을 사용한다고해서 오버로딩이 되는 것이 아니고 1. 같은 이름의 메서드명 2. 매개변수의 개수나 타입이 다르게 정의되어야함
### 메소드 오버라이딩(overriding) 조상 클래스로부터 상속받은 메소드(method)의 내용을 자손 클래스에 맞게 변경하는 것 오버로딩은 기존 메소드에 새로운 내용이 추가되지만, 오버라이딩은 기존 메소드 중 중복되는 내용이 새로운 내용으로 변경 오버라이딩(overriding)은 상속받은 기존의 메소드를 재정의하는 것
##### 예습 자료 추상화 : 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단히 만드는 것 추상 자료형을 클래스 / 추상 자료형의 인스턴스를 객체 / 추상 자료형에서 정의된 연산을 메소드(함수) / 메소드의 호출을 생성자 상속 : 새로운 클래스가 기존의 클래스의 자료와 연산을 이용할 수 있게 하는 기능 다형성 : 한 요소에 여러 개념을 넣어 놓는 것


*** [이전 블로그](https://blog.naver.com/021skyfall/222967475820)에서 옮겨짐
이 블로그는 저작권자의 CC BY 4.0 라이센스를 따릅니다.