객체지향 프로그래밍(OOP, Object Oriented Programming)의 기본 개념들을 정리해보려고 한다.


주요내용
  • 클래스와 객체
  • 필드와 메서드(static키워드)
  • 생성자
  • this vs this() 생성자 호출 메서드
  • 내부클래스




객체지향 프로그래밍(OOP, Object Oriented Programming)프로그래밍에서 필요한 데이터를 모아 추상화시켜 객체를 만들고 객체들 간의 상호작용을 통해 특정 기능을 구성하는 프로그래밍 방법론을 지칭하며 프로그램 개발 유지 보수에 드는 비용과 시간을 줄일 있고, 데이터를 손실 없이 관리하기에 용이하다.

Ex)레고 하나하나- 독립적 속성
조합 결과물


클래스와 객체


객체는 new 키워드로 생성할 있다.

클래스명 참조_변수명; // 인스턴스를 참조하기 위한 참조변수 선언
참조_변수명 = new 생성자(); // 인스턴스 생성 후, 객체의 주소를 참조 변수에 저장


클래스(Class) : 객체를 정의한 '설계도(blueprint)' 또는 '(frame)’

클래스는 객체를 생성하는데 사용되며, 반대로 객체는 클래스에 정의되고 설계된 내용 그대로 생성

인스턴스: 클래스를 통해 생성된 객체, 해당 객체가 어떤 클래스로부터 생성된 것인지를 강조

클래스 =붕어빵
인스턴스 = 붕어빵
로 비유하면 이해하기 편함

클래스

class 클래스명 { // 클래스 정의

클래스의 구성요소

public class Hi {
	int x = 10; // (1)필드 -클래스의 속성을 나타내는 변수
	void Hello() {...} // (2)메서드 -클래스의 기능을 나타내는 함수
	Hi {...} // (3)생성자 -클래스의 객체를 생성
	class Hi2 {...} // (4)이너 클래스 -클래스 내부의 클래스

이때 필드와 메서드, 생성자를 멤버라고 부른다


객체
객체는 속성(필드)과 기능(메서드)라는 두개의 구성 요소로 이루어져 있으며
new 키워드를 통해 객체를 생성한 후에는 포인트 연산자를 통해 해당 객체의 멤버에 접근이 가능하다.

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

 

 



 

 

 

필드와 메서드

필드란 ‘클래스에 포함된 변수' 의미하는 것으로 객체의 속성을 정의할 사용

class Example { // => 클래스 영역
	int instanceVariable; // 인스턴스 변수
	static int classVariable; // 클래스 변수(static 변수, 공유변수)

	void method() { // => 메서드 영역
		int localVariable = 0; // 지역 변수. {}블록 안에서만 유효
	}
}

 


클래스 변수는 공통된 저장공간 공유, 인스턴스를 따로 생성하지 않고도 클래스명.클래스변수명 통해 사용이 가능
인스턴스 변수 독립적인 저장 공간을 가짐 인스턴스 생성 후에 참조변수명.인스턴스변수명을 통해 사용 가능

출력값

 

 

 

지역변수는 멤버 변수와는 다르게 지역변수는 스택 메모리에 저장되어 메서드가 종료되는 것과 동시에 함께 소멸되어 더이상 사용할 수 없게 됨.

초기값에도 차이가 있다.

 

클래스영역

스택 메모리 영역 <=지역변수 저장

힙 메모리영역 <= 필드 저장

 

메모리에는 공간이 저장될 없기 때문 이곳에 저장되는 필드는 강제로 초기화되지만, 스택 메모리는 강제로 초기화되지 않으므로 지역 변수는 선언시 반드시 초기화를 실행해주어야






메서드

자바제어자 반환타입 메서드명(매개 변수) { // 메서드 시그니처
	메서드 내용 // 메서드 바디
}

*메서드의 반환타입이 void 아닌 경우에는 메서드 바디({} )안에 반드시 return 문이 존재해야.

클래스 외부에서 메서드를 사용하기 위해서는 먼저 인스턴스를 생성해야 함.
그 후 포인트 연산자(.) 통해 메서드를 호출



메서드도 마찬가지로 static 키워드를 붇이면 정적 매서드가 되고, 클래스명만으로 접근이 가능
또 정적 메서드의 경우 인스턴스 변수 또는 인스턴스 메서드를 사용할 수 없다.


메인 메서드에서 인스턴스 변수와 인스턴스 메서드 불러와 실행하려고 할 때 참조를 할 수 없다고 오류가 뜸

Why?
참조를 하려면 메모리 어딘가에 인스턴스가 있어야 함
Static이 달려있는 변수는 메모리에 딱 하나뿐, 따라서 모든 객체가 공유
그래서 한 객체에 있는 클래스 변수를 바꾸면 다른 객체의 클래스 변수도 바뀜






매서드 오버로딩: 하나의 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것

메서드 오버로딩이 성립하기 위해서는
1. 같은 이름의 메서드명을 써줘야하고,
2. 매개변수의 개수나 타입이 다르게 정의되어야 함

반환 타입은 상관없다.







참고) calss변수와 instance변수자료형에는 초기값도 있따.

boolean -false
char - '\u0000'(공백1칸)
byte,short,int - 0
long - 0L
float - 0.0f
double - 0.0d 또는 0.0
참조형 변수 - null

 

*클라스와 인스턴스는 자동 초기화가 되는 반면, 메서드 변수는 값을 넣어줘야 한다.


메서드 변수에 초기화를 하지 않고 사용시 다음과 같이 초기화가 되지 않았다는 메시지 뜸

Why? 개발자가 만드는 오류들을 최소화하기 위해서


 

 

 

생성자

생성자란 인스턴스 생성 시 호출되는 인스턴스 변수 초기화 메서드이다!

인스턴스 생성을 담당하는 것은 new 키워드이며, 생성자는 인스턴스 변수들을 초기화하는 사용되는 특수한 메서드

클래스명(매개변수) { // 생성자 기본 구조
	...생략...
}

 

 

규칙
생성자의 이름은 반드시 클래스의 이름과 같아야.
생성자는 리턴 타입이 없다.

생성자도 앞서 학습했던 버로딩이 가능하므로 클래스 내에 여러 개의 생성자가 존재할 있다

 

public class ConstructorExample {
    public static void main(String[] args) {
        Constructor constructor1 = new Constructor();
        Constructor constructor2 = new Constructor("Hello World");
        Constructor constructor3 = new Constructor(5,10);
    }
}

class Constructor {
    Constructor() { // (1) 생성자 오버로딩 매개변수가 없는 생성자
        System.out.println("1번 생성자");
    }

    Constructor(String str) { // (2) 매개변수(str)가 있는 생성자
        System.out.println("2번 생성자");
    }

    Constructor(int a, int b) { // (3) 매개변수(int)가 2개인 생성자
        System.out.println("3번 생성자");
    }
}

(2) 생성자를 호출하기 위해서는 객체 생성 시에 문자열을 전달해주어야 하고,
(3) 생성자를 위해서는 개의 int 매개변수를 전달해주어야 함


매개변수가 있는 생성자는 메서드처럼 매개변수를 통해 호출 시에 해당 값을 받아 인스턴스를 초기화하는 사용.
고유한 특성을 가진 인스턴스를 계속 만들어야하는 경우 인스턴스마다 각기 다른 값을 가지고 초기화할 있다는 것이 장점



this vs this()

 

this this()
인스턴스 자신을 가리키는 참조변수

인스턴스의 주소가 저장

주로 인스턴스 변수와 매개변수로 정의된 지역변수를 구분하는데 사용
같은 클래스의 다른 생성자를 호출할 때 사용

 

 


this() 메서드


같은 클래스 안에 메서드들끼리 서로 호출할 있었던 것처럼 생성자도 상호 호출이 가능
this() 메서드는 자신이 속한 클래스에서 다른 생성자를 호출하는 경우에 사용

만약 클래스명이 Car라는 Car 클래스의 생성자를 호출하는 것은 Car() 아니라 this()이고, 효과는 Car() 생성자를 호출하는 것과 동일

This() 메서드를 사용하기 위한 조건


1.생성자의 내부에서만 사용할 있다.
2.생성자의 줄에 위치해야 한다.

 



this 키워드

인스턴스 변수와 매개변수를 이름만으로는 구분하기가 어려울 때 사용
this 인스턴스 자신을 가리키며, 우리가 참조변수를 통해 인스턴스의 멤버에 접근할 있는 것처럼 this 통해서 인스턴스 자신의 변수에 접근할 있는

public class ConstructorExample {
    public static void main(String[] args) {
        Car car = new Car("Model X", "빨간색", 250);
        System.out.println("제 차는 " + car.getModelName() + "이고, 컬러는 " +  car.getColor() + "입니다.");
    }
}

class Car {
    private String modelName;
    private String color;
    private int maxSpeed;

    public Car(String modelName, String color, int maxSpeed) {
        this.modelName = modelName;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }

    public String getModelName() {
        return modelName;
    }

    public String getColor() {
        return color;
    }
}

//Output
제 차는 Model X이고, 컬러는 빨간색입니다.


자바 프로그래밍에서 많은 경우 메서드의 지역 변수명이 필드명과 동일하게 구성되어있기 때문에 형식에 익숙해지는 것이 좋다.

 

 

 

 

 

내부클래스

클래스 내에 선언된 클래스, 외부 클래스와 내부 클래스가 서로 연관되어 있을 사용

class Outer { // 외부 클래스
	
	class Inner {
		// 인스턴스 내부 클래스	
	}
	
	static class StaticInner {
		// 정적 내부 클래스
	}

	void run() {
		class LocalInner {
		// 지역 내부 클래스
		}
	}
}

내부 클래스는 변수가 선언 위치에 따라 인스턴스 변수, 클래스 변수, 그리고 지역 변수로 구분되는 것과 유사하게 위치를 중심으로 구분 유효범위(scope) 특성도 변수와 매우 유사

 

 

종류 선언위치 사용 가능한 변수
인스턴스 내부 클래스 외부클래스의 멤버변수 선언위치 외부 인스턴스 변수,외부 전역변수
정적 내부 클래스 외부클래스의 멤버변수 선언위치 외부 전역변수
지역 내부 클래스 외부클래스의 메서드,초기화블럭 내부 외부 인스턴스 변수, 외부 전역변수
익명 내부 클래스 클래스의 선언과 객체의 생성을 동시에 하는 일회용 익명 클래스 외부 인스턴스 변수,외부 전역변수






학습 후 느낀점


중요한 것은 복습과 실습

한번에 이해가 안됐던 개념도 직접 inttelij에 쳐보며 복습하니
두번보고 세번볼 수록 개념이 머릿속에 확립되었따
또 블로그에 정리하며 한번 더 복습하고 정리할 수 있었다.

'Java' 카테고리의 다른 글

Java - 람다와 메서드 참조  (0) 2022.09.18
Java-삼항연산자  (0) 2022.09.17
Java - 다형성  (0) 2022.09.17
Java - 스레드의 생성과 실행  (0) 2022.09.17
Java 기초  (0) 2022.09.06
복사했습니다!