코드스테이츠 11일차

안형준·2022년 5월 10일
0

코드스테이츠

목록 보기
11/32
post-thumbnail

1차 학습목표

  1. 객체지향 프로그래밍의 기본 토대인 객체를 이해할 수 있다.
  2. 객체를 만드는 데 필요한 클래스의 대한 개념을 이해하고, 클래스에 기반하여 객체를 생성할 수 있다.
  3. 클래스를 구성하는 중요한 구성요소로서 필드와 메서드, 그리고 생성자를 이해하고 활용할 수 있다.
  4. 객체지향 프로그래밍의 기초 내용을 블로깅을 통해 정리하고 기록한다.
객체지향 프로그래밍(OOP, Object Oriented Programming)
컴퓨터 프로그래밍의 관점에서 보면 일련의 명령어들의 나열을 통해 컴퓨터에게 말을 건네는 절차적 프로그래밍 방식과는 다르게, 객체지향적 프로그래밍은 “프로그래밍에서 필요한 데이터를 한 데 모아 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 상호작용”을 통해 특정 기능을 구성하는 프로그래밍 방법론이다.

👻클래스(Class)
클래스(Class)란 객체를 ‘정의한 설계도(blueprint)' 또는 '틀(frame)’이라 정의할 수 있다.
즉, 클래스는 객체를 생성하는데 사용되며, 반대로 객체는 클래스에 정의되고 설계된 내용 그대로 생성된다.
예를 들어 TV로 보자면, TV 완제품은 객체이고, TV 설계도는 class이다. 그렇기에 클래스는 객체 그 자체가 될 수는 없다.
클래스를 통해 생성된 객체를 클래스의 인스턴스(instance)라고 한다.
또한 클래스로부터 객체를 만드는 과정을 인스턴스화(instantiate)라고 한다.

그렇다면 객체와 인스턴스의 차이는?
이 둘은 혼용하여 사용할 수 있는데, 굳이 구분하자면
객체는 모든 인스턴스를 포괄하는 넓은 의미를 가지고 있는 반면, 인스턴스는 해당 객체가 어떤 클래스로부터 생성된 것인지를 강조한다는 점이다.

👻클래스의 구성요소와 기본 문법
클래스는 필드(field), 메서드(method), 생성자(constructor), 그리고 이너 클래스(inner class)로 구성되어 있다.
ex)
public class ExampleClass {
   int x = 10; // (1)필드
   void printX() {...} // (2)메서드
   ExampleClass {...} // (3)생성자
   class ExampleClass2 {...} // (4)이너 클래스
} 

👻객체(Object)
객체는 크게 속성과 기능이라는 두 가지 구성요소로 이루어져 있다.

👻객체의 생성과 활용
객체의 생성?
객체는 new 키워드로 생성할 수 있다.
경우에 따라 메서드를 사용해 객체를 생성할 수도 있지만 이 경우도 내부적인 작업을 통해 new 키워드를 통해 객체를 생성하는 것이기 때문에 결국에는 동일한 방식이라 할 수 있다.
객체 생성 ex)
클래스명 참조_변수명; // 인스턴스를 참조하기 위한 참조변수 선언
참조_변수명 = new 생성자(); // 인스턴스 생성 후, 객체의 주소를 참조 변수에 저장
위 과정을 줄여 아래와 같이도 선언할 수 있다.
클래스명 참조_변수명 = new 생성자();
new 키워드와 생성자를 통해 클래스의 객체를 생성한다는 것은 해당 객체를 힙 메모리에 넣고 그 주소값을 참조변수에 저장하는 것과 같다.

👻객체의 활용
포인트 연산자 .을 통해  ‘해당 위치에 있는 객체 안을 보세요'라는 뜻을 갖게할 수 있다.
ex)
참조 변수명.필드명 // 필드값 불러오기
참조 변수명.메서드명() // 메서드 호출

👻필드(Field)
필드는 ‘클래스에 포함된 변수'를 의미하는 것으로 객체의 속성을 정의할 때 사용된다.
자바에서 변수는 크게 클래스 변수(cv, class variable), 인스턴스 변수(iv, instance variable), 그리고 지역 변수(lv, local variable)라는 세 가지로 구분될 수 있다.
이 중 우리가 필드라 부른 것은 클래스 변수와 인스턴스 변수이며, 이 둘은 다시 static 키워드의 유무로 구분할 수 있다.
static 키워드가 함께 선언된 것은 클래스 변수, 그렇지 않은 것은 인스턴스 변수이다.
그리고 이 두 가지 변수 유형에 포함되지 않고 메서드 내에 포함된 모든 변수를 지역변수라 부른다.
인스턴스 변수(iv)는 인스턴스가 가지는 각각의 고유한 속성을 저장하기 위한 변수로 new 생성자() 를 통해 인스턴스가 생성될 때 만들어진다. 그리고 동일한 클래스로부터 생성되었지만 객체의 고유한 개별성을 가진다.
다음으로, static 키워드를 통해 선언하는 클래스 변수(cv)가 있다.
클래스 변수는 독립적인 저장 공간을 가지는 인스턴스 변수와 다르게 공통된 저장공간을 공유하는데, 한 클래스로부터 생성되는 모든 인스턴스 들이 특정한 값을 공유해야하는 경우에 주로 static 키워드를 사용하여 클래스 변수를 선언하게 된다.
사람을 예로 들면 손가락, 발가락 개수와 같이 모든 사람이 공유하는 특성을 저장하는 데에 사용한다.
지역변수(lv)는 메서드 내에 선언되며 메서드 내({} 블록)에서만 사용가능한 변수이다.
멤버 변수와는 다르게 지역변수는 스택 메모리에 저장되어 메서드가 종료되는 것과 동시에 함께 소멸된다.
또한 힙 메모리에 저장되는 필드 변수는 객체가 없어지지 않는 한 절대로 삭제되는 않는 반면에 스택 메모리에 저장되는 지역변수는 한동안 사용하지 않는 경우 가상 머신에 의해 자동으로 삭제된다.
힙 메모리에는 빈 공간이 저장될 수 없기 때문에 이곳에 저장되는 필드는 강제로 초기화되지만, 스택 메모리는 강제로 초기화되지 않으므로 지역 변수는 선언시 반드시 초기화를 실행해주어야 한다.

👻static 키워드
static은 클래스의 멤버(필드, 메서드, 이너 클래스)에 사용하는 키워드이다.
static 키워드가 붙어있는 멤버를 우리는 ‘정적 멤버(static member)’라고 부르고 static이 붙어있지 않은 인스턴스 변수와 구분한다.
인스턴스 멤버는 반드시 객체를 생성한 이후에 변수와 메서드에 접근하여 해당 멤버를 사용가능한 반면, static 키워드로 정의되어 있는 클래스 멤버들은 인스턴스의 생성 없이도 클래스명.멤버명 만으로도 사용이 가능하다.
물론 정적 멤버도 객체를 생성한 이후 참조변수를 통해 사용이 가능하지만, 처음부터 정적 멤버임을 표시하기 위해 클래스명.멤버명 의 형태로 사용하는 것이 좋다.
new 키워드를 통해 생성된 인스턴스는 힙 메모리에 생성되고 독립적인 저장공간을 가지게 되는 반면 static 키워드로 선언된 정적 멤버는 클래스 내부에 저장 공간을 가지고 있기 때문에 객체 생성 없이 곧바로 사용할 수 있다.
정적 메서드의 경우 인스턴스 변수 또는 인스턴스 메서드를 사용할 수 없다. 이유는?
정적 메서드는 인스턴스 생성 없이 호출이 가능하기 때문에 정적 메서드가 호출되었을 때 인스턴스가 존재하지 않을 수 있기 때문이다.
정리하자면, static 키워드는 클래스의 멤버 앞에 붙일 수 있고, 정적 멤버의 가장 큰 특징은 인스턴스를 따로 생성하지 않아도 클래스명만으로도 변수나 메서드 호출이 가능하다는 점이었고, 이는 메모리의 저장위치와 관련이 있다.

👻메서드(Method)
메서드는 “특정 작업을 수행하는 일련의 명령문들의 집합"을 의미한다.
메서드 시그니처(method signature)와 몸통에 해당하는 메서드 바디(method body)로 구분할 수 있다.
ex)
자바제어자 반환타입 메서드명(매개 변수) { // 메서드 시그니처
   메서드 내용 // 메서드 바디
}
만약 메서드의 반환타입이 void가 아닌 경우에는 메서드 바디({} )안에 반드시 return 문이 존재해야 한다.

👻메서드의 호출
메서드도 클래스의 멤버이므로 클래스 외부에서 메서드를 사용하기 위해서는 먼저 인스턴스를 생성해야 한다.
물론 클래스 내부에 있는 메서드끼리는 따로 객체를 생성하지 않고도 서로를 호출할 수 있다.

👻메서드 오버로딩(Method Overloading)
매서드 오버로딩이란 하나의 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것을 의미한다.
보통 하나의 메서드에 하나의 기능만을 구현해야하는데, 같은 이름의 메서드를 여러 기능을 구현하기 때문에 오버로딩이란 용어를 사용한 것이다.
오버로딩이 성립하기 위해서는 크게 두 가지 조건이 필요한데, 같은 이름의 메서드명을 써줘야하고, 매개변수의 개수나 타입이 다르게 정의되어야 한다.
물론 무조건 같은 메서드명을 사용한다고해서 오버로딩이 되는 것이 아니라는 사실을 명심하자
오버로딩의 장점은?
가장 큰 장점은 하나의 메서드로 여러 경우의 수를 해결할 수 있다는 것이다.

오늘은 객체지향에 대해 학습했다.
객체지향은 코드의 재사용성이 높고, 유지보수가 용이하며 중복 코드를 제거할 수 있어 도입되었다고 한다.
하지만 객체지향은 현재까지도 수많은 개발자들이 어려워 할 정도로 난이도가 높다고 한다. 그렇기에 시작하기도 전에 겁이 났었다. 인터넷이나 주변 개발자 분들의 조언을 듣자면, 객체지향은 당연히 어려운 개념이고, 여러번 반복적으로 학습을 해야 이해할 수 있다는 얘기를 들었다. 이런 말들을 들으니 조금은 진정이 되었다. 앞으로도 당분간은 추가적으로 학습할 때 객체지향 위주로 공부해 나가려고 한다. 언젠가는 제대로 이해해서 다른 사람들에게 설명해줄 수 있을 만큼 잘하고 싶다.
그날까지 파이팅!

profile
개발 공부

0개의 댓글