11Days) 객체지향 프로그래밍 기초(1) - 클래스와 객체, 필드와 메서드

nacSeo (낙서)·2022년 11월 3일
0

◉ 학습목표

1. 클래스와 객체에 관해 이해하고 설명할 수 있다.
2. 필드와 메서드에 관해 이해하고 설명할 수 있다.
  1. 클래스와 객체

⦿ 학습내용

☞ 기본 개념

✔︎ 클래스 (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 인스턴스
}

☞ 객체의 활용

✔︎ 포인트 연산자 (.) : 해당 위치에 있는 객체 안을 보라는 의미

참조_변수명.필드명	// 필드값 불러오기
참조_변수명.메서드명()	// 메서드 호출
  1. 필드와 메서드

⦿ 학습내용

☞ 필드

✔︎ 필드 (Field) : 클래스에 포함된 변수
✔︎ 클래스 변수, 인스턴스 변수

☞ 변수 유형

✔︎

class ExampleClass {	// 클래스 영역
	
	int instanceVariable;	// 인스턴스 변수
    static int classVariable;	// 클래스 변수 (static 변수, 공유 변수)
    
    public void exampleMethod() {	// 메서드 영역
    	
    	int localVariable;	// 지역 변수, 메서드 내 ({ } 블록) 에서만 유효
        }
    }

✔︎ 클래스 변수 : static 키워드와 함께 선언
✔︎ 인스턴스 변수 : static 키워드 없이 선언
✔︎ 지역 변수 : 메서드 내 포함된 모든 변수
※ 변수는 선언 위치static 키워드 유무에 따라 구분
✔︎ 필드 변수(클래스 변수, 인스턴스 변수) vs 지역 변수
✓ 필드 변수
・ 객체가 없어지지 않는 한 삭제 ❌
・ 직접적으로 초기화를 실행하지 않더라도 강제로 초기화, 힙 메모리에는 빈 공간이 저장될 수 없기 때문
✓ 지역 변수
・ 스택 메모리에 저장되어 메서드가 종료되는 것과 동시에 함께 소멸
・ 직접 초기화하지 않으면 값을 출력할 때 오류 발생 💥, 스택 메모리는 강제로 초기화가 되지 않기 때문

☞ static 키워드

✔︎ 클래스의 멤버(필드, 메서드, 이너 클래스)에 사용하는 키워드
✔︎ 정적 멤버 (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이다. 회고라고도 하는데 학습한 내용들을 돌아보며 무엇이 좋았고, 문제였는지, 좋았던 것은 어떻게 발전시킬지, 앞으로 문제는 어떻게 해결해 나갈 것인지 자기 객관화를 통해 스스로 작성해보는 것인데, 이 것은 내가 지금 쓰고 있는 느낀 점에서 잘 실천해나가고 있는 것 같다 ☺️

내용을 들으며 공감되는 내용들도 많이 있었다. 내가 내향적이라 이렇게 글을 쓰기 창피할 수도 있고, 구글링을 해보니 잘 정리된 글들도 많았다. 그리고 나만의 언어로 다시 정리하기가 어려워 여러 문서들을 찾아보며 작성하고 있었고, 무엇보다 내 생각대로 작성하다 틀린 내용을 블로깅하는 것이 가장 무서웠던 것 같다. 그렇지만 나만의 것으로 만들기 위해서는 당연히 내가 내 생각대로 정리해서 기록하면 된다 생각했고, 틀리면 수정해주면 된다고 생각을 바꿔먹었다 :) 처음하는 블로깅도 앞으로 점점 더 발전해나가야지 다짐한다! 🙏

◉ 내일의 키워드

・ 생성자
・ 내부 클래스
profile
백엔드 개발자 김창하입니다 🙇‍♂️

0개의 댓글