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이다. 회고라고도 하는데 학습한 내용들을 돌아보며 무엇이 좋았고, 문제였는지, 좋았던 것은 어떻게 발전시킬지, 앞으로 문제는 어떻게 해결해 나갈 것인지 자기 객관화를 통해 스스로 작성해보는 것인데, 이 것은 내가 지금 쓰고 있는 느낀 점에서 잘 실천해나가고 있는 것 같다 ☺️
내용을 들으며 공감되는 내용들도 많이 있었다. 내가 내향적이라 이렇게 글을 쓰기 창피할 수도 있고, 구글링을 해보니 잘 정리된 글들도 많았다. 그리고 나만의 언어로 다시 정리하기가 어려워 여러 문서들을 찾아보며 작성하고 있었고, 무엇보다 내 생각대로 작성하다 틀린 내용을 블로깅하는 것이 가장 무서웠던 것 같다. 그렇지만 나만의 것으로 만들기 위해서는 당연히 내가 내 생각대로 정리해서 기록하면 된다 생각했고, 틀리면 수정해주면 된다고 생각을 바꿔먹었다 :) 처음하는 블로깅도 앞으로 점점 더 발전해나가야지 다짐한다! 🙏
・ 생성자
・ 내부 클래스