1. 클래스와 객체에 관해 이해하고 설명할 수 있다.
2. 필드와 메서드에 관해 이해하고 설명할 수 있다.
- 클래스와 객체
✔︎ 클래스 (class) : 객체를 정의한 설계도(blueprint)
혹은 틀(frame)
(ex. 붕어빵 기계)
✔︎ 객체 (object) : 실제 사용할 수 있는 실체 (ex.붕어빵들)
✔︎ 인스턴스 (instance) : 클래스를 통해 생성된 객체
※ 객체 vs 인스턴스
✓ 객체 : 모든 인스턴스를 포괄하는 넓은 의미
✓ 인스턴스 : 해당 객체가 어떤 클래스로부터 생성된 것인 지 강조
✔︎ 클래스 정의
class 클래스명 { // 클래스 정의
}
✔︎ 클래스 구성요소
✓ 필드 (field) : 클래스의 속성
을 나타내는 변수 (ex.자동차의 모델명, 컬러, 바퀴 수 등)
✓ 메서드 (method) : 클래스의 기능
을 나타내는 변수 (ex. 자동차의 시동, 가속, 정지 등)
✓ 생성자 (constructor) : 클래스의 객체를 생성하는 역할
✓ 이너 클래스 (inner class) : 클래스 내부의 클래스
※ 클래스의 멤버 (member) : 필드, 메서드, 이너 클래스
public class ExampleClass {
int x = 10; // 필드
void printX() {...} // 메서드
ExampleClass {...} // 생성자
class ExampleClass2 {...} // 이너 클래스
}
✔︎ 객체 구성요소
✓ 속성 : 필드
로 정의
✓ 기능 : 메서드
로 정의
※ 객체의 멤버 (member) : 속성, 기능
✔︎ 객체 생성 : new
키워드 사용, 객체 생성 후에는 포인트 연산자(.)
를 통해 해당 객체의 멤버에 접근
클래스명 참조_변수명 = new 생성자();
🌟 나의 생각 : 참조 변수는 실제 데이터 값이 아니라 실제 데이터가 저장되어 있는 힙 메모리의 주소값
을 가리키고, new
키워드는 생성자를 통해 생성된 객체를 힙 메모리에 넣는 역할을 수행한다고 배웠다. 힙 메모리가 뭔지 정확한 정의를 내 스스로 내릴 수 없어서 검색해본 결과, stack과 heap에 대해 공부해볼 수 있었다.
① 스택 (Stack) : 힙 영역에 생성된 객체 타입의 데이터의 참조값
이 할당
② 힙 (Heap) : 모든 객체는 힙 영역에 생성되고, 힙 영역에 있는 객체들을 가리키는 참조 변수가 stack에 올라간다
라고 나와 있었다.
이 것과 타입 때 배운 것을 바탕으로 미루어보아 스택은 참조 변수와 주소값에 관련된 참조 타입
인 것이고, 힙은 실제 값을 저장하는 것과 관련 된 기본 타입
인 것으로 결론을 내렸다.
class CarTest {
public static void main(String[] args) {
Car bmw = new Car(); // Car 클래스를 기반으로 생성된 bmw 인스턴스
Car tesla = new Car(); // Car 클래스를 기반으로 생성된 tesla 인스턴스
Car audi = new Car(); // Car 클래스를 기반으로 생성된 audi 인스턴스
}
✔︎ 포인트 연산자 (.
) : 해당 위치에 있는 객체 안을 보라는 의미
참조_변수명.필드명 // 필드값 불러오기
참조_변수명.메서드명() // 메서드 호출
- 필드와 메서드
✔︎ 필드 (Field) : 클래스에 포함된 변수
✔︎ 클래스 변수, 인스턴스 변수
✔︎
class ExampleClass { // 클래스 영역
int instanceVariable; // 인스턴스 변수
static int classVariable; // 클래스 변수 (static 변수, 공유 변수)
public void exampleMethod() { // 메서드 영역
int localVariable; // 지역 변수, 메서드 내 ({ } 블록) 에서만 유효
}
}
✔︎ 클래스 변수 : static 키워드와 함께 선언
✔︎ 인스턴스 변수 : static 키워드 없이 선언
✔︎ 지역 변수 : 메서드 내 포함된 모든 변수
※ 변수는 선언 위치
와 static 키워드 유무
에 따라 구분
✔︎ 필드 변수(클래스 변수, 인스턴스 변수) vs 지역 변수
✓ 필드 변수
・ 객체가 없어지지 않는 한 삭제 ❌
・ 직접적으로 초기화를 실행하지 않더라도 강제로 초기화, 힙 메모리에는 빈 공간이 저장될 수 없기 때문
✓ 지역 변수
・ 스택 메모리에 저장되어 메서드가 종료되는 것과 동시에 함께 소멸
・ 직접 초기화하지 않으면 값을 출력할 때 오류 발생 💥, 스택 메모리는 강제로 초기화가 되지 않기 때문
✔︎ 클래스의 멤버(필드, 메서드, 이너 클래스)에 사용하는 키워드
✔︎ 정적 멤버 (static member) : static
키워드가 붙어있는 멤버 (↔︎ static
이 붙어있지 않은 인스턴스 변수와 구분
※ 차이점 🔥
✓ 인스턴스 멤버
・ 반드시 객체를 생성한 후 변수와 메서드에 접근하여 해당 멤버 사용 가능
・ new
키워드를 통해 생성된 인스턴스는 힙 메모리에 생성되고 독립적인 저장공간을 갖기 때문
✓ 클래스 멤버
・ 인스턴스 생성 없이도 클래스명.멤버명
만으로도 사용 가능
・ 클래스 내부에 저장 공간을 가지고 있기 때문에 객체 생성 없이 바로 사용가능하기 때문
✔︎ 특징
✓ 정적 필드는 객체 간 공유 변수의 성질이 있음 (static
메서드(정적 메서드)도 동일하게 적용)
✓ 정적 메서드의 경우 인스턴스 변수 또는 인스턴스 메서드 사용 ❌ (인스턴스가 존재하지 않을 수 있기 때문)
🌟 관련 실습
class Car {
public int instanceVariable; // 인스턴스 변수
public static int classVariable; // 클래스 변수
public static void classMethod() {
System.out.println(instanceVariable); // 인스턴스 변수 (에러 발생!)
System.out.println(classVariable); // 클래스 변수
}
// 클래스 메서드에서 클래스 변수 접근 가능
// 클래스 메서드에서 인스턴스 변수 접근 불가
public void instanceMethod() {
System.out.println(instanceVariable); // 인스턴스 변수
System.out.println(classVariable); // 클래스 변수
}
// 문제 없음!
}
public class CarTest {
public static void main(String[] args) {
System.out.println(Car.classVariable);
System.out.println(Car.instanceVariable); // 오류 발생!
Car.classMethod();
Car.instanceMethod(); // 오류 발생!
}
}
Car car = new Car();
로 생성!✔︎ 메서드 (Method) : 특정 작업을 수행하는 일련의 명령문들의 집합
자바제어자 반환타입 메서드명(매개_변수) { // 메서드 시그니처
메서드_내용 // 메서드 바디
}
✓ 메서드 시그니처 (method signature) : 해당 메서드가 어떤 타입을 반환하는가(반환타입), 메서드 이름이 무엇(메서드명)이며 해당 작업을 수행하기 위해 어떤 재료들이 필요한지(매개 변수)에 대한 정보를 포함
✓ 메서드 바디 (method body) : 괄호({}
)안에 해당 메서드가 호출되었을 때 수행되어야할 일련의 작업들을 표시
※ 메서드 반환타입이 void
가 아닌 경우, 메서드 바디({}
)안에 반드시 return
문 존재해야 함
✔︎ 메서드 정의 순서
① 메서드의 역할
을 정확히 정한다.
② 메서드의 입출력
을 정한다.
③ 메서드의 시그니처
를 정의한다.
④ 메서드 바디
를 정의한다.
✔︎ 클래스 외부에서 메서드를 사용하기 위해서는 인스턴스를 생성하고, 포인트 연산자(.
)를 통해 메서드 호출
✔︎ 클래스 내부에 있는 메서드끼리는 따로 객체를 생성하지 않아도 서로 호출 ⭕️
void printHello() { // 반환 타입이 void인 메서드
System.out.println("hello!");
}
int getNumSeven() { // 매개변수가 없는 메서드
return 7;
}
Double multiply(int x, double y) { // 매개변수가 있는 메서드
double result = x*y;
return result;
}
메서드_이름(매개변수1, 매개변수2, ...); // 메서드 호출 방법. 매개 변수 없을 수도 있음.
void printHello();
int getNumSeven();
Double multiply(4, 4.0);
// 출력 값
hello!
7
16.0
✔︎ 인자 (argument) : 메서드 호출 시 괄호() 안에 넣어 주는 입력 값
✔︎ 인자의 개수와 순서는 반드시 메서드를 정의할 때 선언된 매개변수와 일치되어야 함
✔︎ 메서드 오버로딩 (Method Overloading) : 하나의 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것
✔︎ 메서드 오버로딩 조건
✓ 메서드의 이름이 같아야 함
✓ 매개변수의 개수 또는 타입이 달라야 함
✔︎ 오버로딩의 장점
✓ 하나의 메서드로 여러 경우의 수를 해결할 수 있음
☞ 오늘 객체 지향 프로그래밍인 자바에 대해 여러 개념들과 정보들을 접했다. 다 들어봤던 단어들인데 딱 정의해보라고 하면 말문이 막히는 그런 기초적이지만 중요한 내용들이었던 것 같다. 진정한 이해를 하는 것은 남이 알아들을 수 있게 설명하는 것이라 하였다. 물론 오늘 하루 여러 개념들이 머릿 속에 들어왔지만 이를 내 것으로 만들고, 까먹지 않기 위해서는 주말까지 활용하여 복습
하고, 직접 intellij로 실습
해보며 익혀나가는 것이라 느끼고 실천하기로 다짐했다!😤
오늘은 이론학습 뿐 아니라 블로깅에 대해 공부해보는 시간을 갖기도 하였다. 블로깅..? 무슨 수업을 하길래 이렇게 시간을 잡아두고 하는 거지? 라고 생각했지만 들으면서 되게 알차다고 느껴졌다 :) 첫 날 메타인지와 함께 블로깅에 대해 공부했었는데 좀 더 동기부여가 되고 앞으로 어떻게 써내려가야할 지 방향성을 잡아주는 시간이었다.
우선, 블로깅을 하는 이유가 가장 중요하다. 첫 째, 매일매일 일기처럼 써내려가면서 꾸준함을 보여주는 기록
이 될 수 있을 것이고, 둘 째, 첫 날 배운 나를 돌아볼 수 있는 메타인지
시간이 될 수 있을 것이다. 마지막으로 오늘 배운 내용들을 다시 한 번 복습하고 상기시켜보며 문제 해결 능력
또한 향상된다는 것이 그 까닭이다.
그럼 블로깅에는 무엇을 작성해야 하는가? 첫 째는 TIL (Today I Learned)
일 것이다. 메타인지와 관련이 있는데 오늘 내가 배운 것을 다시 한 번 상기시켜보며 자아성찰을 할 수 있는 내용이어야겠다. 둘 째는 Error Handling Log
이다. 쉽게 말하면 문제를 풀다보면 에러와 맞닥들이게 되는데 그 때, 그 오류를 해결해나가는 과정과 내 생각들을 기록해나가는 것이다. 10일차 블로깅을 진행하고 있는 나는 초보이기에 문제를 풀다가 당연히 수많은 에러들과 맞닥들이고 논리적 사고, 구글링 등을 통해 해결해가고 있지만, 항상 블로깅을 하루 공부가 마쳐갈 때쯤이나 다 끝나고 작성하기에 기억을 못하는 경우가 더러 있어 딱히 기록하지 못하고 있다..😭 앞으로는 오류가 발생할 때마다 까먹지 말고 캡쳐를 통해 블로깅에도 신경쓸 수 있도록 노력해나가야 겠다. 마지막으로는 Look Back
이다. 회고라고도 하는데 학습한 내용들을 돌아보며 무엇이 좋았고, 문제였는지, 좋았던 것은 어떻게 발전시킬지, 앞으로 문제는 어떻게 해결해 나갈 것인지 자기 객관화를 통해 스스로 작성해보는 것인데, 이 것은 내가 지금 쓰고 있는 느낀 점에서 잘 실천해나가고 있는 것 같다 ☺️
내용을 들으며 공감되는 내용들도 많이 있었다. 내가 내향적이라 이렇게 글을 쓰기 창피할 수도 있고, 구글링을 해보니 잘 정리된 글들도 많았다. 그리고 나만의 언어로 다시 정리하기가 어려워 여러 문서들을 찾아보며 작성하고 있었고, 무엇보다 내 생각대로 작성하다 틀린 내용을 블로깅하는 것이 가장 무서웠던 것 같다. 그렇지만 나만의 것으로 만들기 위해서는 당연히 내가 내 생각대로 정리해서 기록하면 된다 생각했고, 틀리면 수정해주면 된다고 생각을 바꿔먹었다 :) 처음하는 블로깅도 앞으로 점점 더 발전해나가야지 다짐한다! 🙏
・ 생성자
・ 내부 클래스