230224 WIL. 객체지향프로그래밍

이용만·2023년 2월 24일
0

한주간 배웠던 객체지향 프로그래밍 기초를 정리하면서 되새김질 해보겠다.

객체지향 프로그래밍
객체지향 프로그래밍이란 우리 주변의 환경에서도 흔히 보이는 객체(사람,음식,음료수 등)들을 소프트웨어의 세계에서 표현하기 위해 객체의 핵심적인 개념과 기능만을 추출해서 추상화를 통해 모델링하려는 프로그래밍이다.
EX) 사람 각자에게 이름과 나이 MBTI가 있으며 걷고 먹고 말하는 기능을 가지고 있다.
객체지향 프로그래밍은 절차대로 진행되는 절차지향 프로그래밍과는 다르게 관계성이 있는 객체들의 집합이라는 관점으로 접근한다. 각 객체는 별도의 역할이나 기능을 하니까 역할과 기능에 맞는 책임을 갖는 작은 독립적인 기계 또는 부품이라고 할 수 있다. 작은 기계, 부품들이 여러개가 모여 하나의 완전한 자동차가 만들어지는 것과 같다.

클래스
클래스는 객체를 만들기 위한 하나의 설계도, 틀이라고 볼 수 있다.
객체는 클래스에 정의되고 설계된 대로 생성된다. 클래스와 객체는 항상 붙어다닌다.
예시로 붕어빵이 가장 많이 생각난다. 붕어빵 틀이 있으면 붕어빵은 몇 개든 만들 수 있다.
클래스는 단어 맨 앞에 대문자를 쓰는게 관례이다.

public class Person{
		String name = "yongamn"; //필드
        void walk(){ // 메서드
        "걷는다"
        }
        Person(){ // 생성자
        }
    }

객체
클래스를 통해 만들어진 객체. 객체는 속성(필드)과 기능(메서드)을 가지고 있다.
클래스를 통해 만들어진 객체를 인스턴스(해당 클래스의 객체)라고 부른다
인스턴스와 객체의 차이는 굳이 나누어보자면 인스턴스는 해당 클래스의 해당 객체를 이야기 하고 객체는 여러 모든 인스턴스를 포함한다고 볼 수 있다.
아무래도 "Person 인스턴스, Dog 인스턴스" 이런식으로 인스턴스를 자주 쓰일 듯 하다.
객체의 생성은 new 연산자를 통해 실제 객체를 생성한다. 객체에 접근하기 위해서 '.' 포이트연산자를 통해 객체의 멤버(=필드,메서드)에 접근이 가능하다.

Person person = new Person(){
	person.name = "yongman";
    person.age = 28;
	}

new 키워드와 생성자를 통해 Person 인스턴스를 생성하여 person 참조변수에 할당을 한다.
주의할 점은 person 참조변수에 실제 데이터 값이 아니라 데이터가 저장되어 있는 힙 메모리 주소값을 가리킨다.
person 참조변수는 힙 메모리 주소값을 저장하고 있다.
new 는 실제 객체를 생성하면서 힙 메모리에 넣으라고 지시한다.
Person은(생성자는) 해당 객체를 힙 메모리에 넣는다.
'.' 포인트 연산자를 통해 참조변수 person은 특정 인스턴스 객체의 필드, 메서드 즉 객체의 멤버들에 접근 할 수 있는 것이다.

객체는 속성과 기능.
속성 = 변수, 기능 = 메서드

필드
필드는 클래스에 포함된 변수를 의미하면서 객체의 속성을 이야기 할 때 생성된다.
변수는 클래스 변수, 인스턴스 변수, 지역 변수 3가지로 나뉜다.
클래스 변수와 인스턴스 변수는 static 키워드의 유무에 따라 나뉘어진다.
클래스 변수는 인스턴스 생성 없이 호출이 가능하다. 왜? 메모리 클래스 영역에 저장되기 때문이다 하지만 인스턴스 변수 호출은 불가능 하다. 왜? 메모리에 인스턴스가 아직 생성 안되었을 수도 있기 때문이다. 내가 정리한 바로는 누구에게나 있는 특징을 클래스 변수라고 이해했다.
인스턴스 변수는 new 키워드와 생성자를 통해 인스턴스 생성 이후에 호출이 가능하다. 인스턴스 변수는 각자가 가지고 있는 고유한 속성을 저장한 것이 인스턴스 변수라고 이해했다.
지역변수는 메서드 안에 있으며 항상 초기화를 해줘야 된다.

public class Person(){
	static String head = true; // 클래스 변수
    String name = "yongman"; // 인스턴스 변수
    int age = 28;
    
    void walk(){
    String job = "취업준비생"; // 지역 변수
    }
}

그리고 왜 static을 쓰는가
static 키워드를 사용하면 모든 인스턴스에 공통적으로 적용되는 값을 공유한다.

public class StaticFieldTest {
    public static void main(String[] args) {
        StaticField staticField1 = new StaticField(); // 객체 생성
        StaticField staticField2 = new StaticField();

        staticField1.num1 = 100; 
        staticField2.num1 = 1000;

        System.out.println(staticField1.num1);
        System.out.println(staticField2.num1);

        staticField1.num2 = 150;
        staticField2.num2 = 1500;
        System.out.println(staticField1.num2);
        System.out.println(staticField2.num2);

    }
}

class StaticField {
    int num1 = 10;
    static int num2 = 15;
}

//출력값
100
1000
1500
1500

메서드
클래스의 기능을 담당한다. 자동차로 예를 들다면 가속, 브레이크, 시동이 되겠다.

pulbic int sum(int x, int y){
	result = x + y;
	return result;

메서드명은 나만 알아보기 좋은게 아닌 모두가 알아 볼 수 있는 메서드명을 사용한다.

메서드 오버로딩
오버로딩은 한 클래스 내에서 같은 메서드명으로 여러개 정의하는 것을 이야기 한다.
단, 같은 이름의 메서드명이되 매개변수의 개수나 타입이 다르게 정의 되어야 한다.

class Shape {
    public void area() { // 메서드 오버로딩. 같은 이름의 메서드 4개.
        System.out.println("넓이");
    }
    public void area(int r) {
        System.out.println("원 넓이 = " + 3.14 * r * r);
    }

    public void area(int w, int l) {
        System.out.println("직사각형 넓이 = " + w * l);
    }

    public void area(double b, double h) {
        System.out.println("삼각형 넓이 = " + 0.5 * b * h);
    }
}

생성자
생성자는 객체를 생성하는 역할을 하면서 인스턴스 초기화 메서드이다.
생성자는 리턴 타입이 없으며 이름은 클래스의 이름과 같아야 된다.
그리고 생성자 또한 오버로딩이 가능하다.

public class Constructor(){
	Constructor(){
     "첫번째 생성자";
     }
     Constructor(String str){
     this(); // 첫번째 생성자 호출
     "두번째 생성자 : " + str;
     }
     Constructor(int x, int y){
     "세번째 생성자 : " + x + y;
	 }    
     }

this() 메서드는 자신이 속한 클래스에서 다른 생성자를 호출하는 경우에 쓰인다.
this는 인스턴스 변수와 매개변수(인자)를 이름만으로는 구분하기 어려우니까 구분하기 위해 사용한다. this는 인스턴스 변수 자신을 가리키고 참조변수를 통해 인스턴스의 멤버(필드,메서드)에 접근 할 수 있는 것처럼 this를 통해 인스턴스 변수 , 자신의 변수에 접근 하는 것이다.

내가 약한 부분 강조

인스턴스와 참조변수
참조변수 : 생성되는 인스턴스의 주소 값을 지정

인스턴스 생성방법
클래스명 참조변수명 -> Person person // 객체를 다루기 위한 참조변수 선언
참조변수명 = new 클래스명(); -> person = new Person(); // 객체 생성 후, 생성된 객체의 주소참조변수에 저장

*각 변수의 생성시기
클래스 변수 : 클래스가 메모리에 올라갈 때 // 메소드 영역 저장
인스턴스 변수 : 인스턴스 생성 이 후 // 힙 영역 저장
지역 변수 : 블록 내에서 변수의 선언문이 실행될 때 // 스택영역

*각 변수의 소멸 시기
클래스 변수 : 프로그램이 종료될 때
인스턴스 변수 : 인스턴스가 소멸 할 대
지역변수 : 블록을 벗어날 대

소감

이번주는 클래스, 객체, 필드, 메서드, 생성자에 대해 스스로 찾아보고 정리해보았다.
그동안 ctrl + c, v하기 바빴는데 직접 정리해보니까 다시 한번 머리에 저장이 되었다.
선생님은 이해가 안되는 부분은 직접 이미지를 만드시면서 하셨다는데 이해가 안되는 부분은
코딩과 더불어 구조를 이미지화 해가면서 해야겠다.
이번주는 딱히 어려움은 없었고 무엇보다 썼었던 기능들을 '아, 이래서 이 메서드를 사용한 것이구나' 라고 주로 이해하게 되었다.
앞으로는 객체지향 프로그래밍 심화 다형성,추상화,캡슐화,상속을 배울텐데 코드로도 이해하고
정리 잘해서 잊어먹을 때마다 읽을 수 있도록 해야겠다.

profile
성장하는 개발자가 되고자 합니다.

0개의 댓글