Backend/JAVA정리

객체 지향 프로그래밍

coding dew 2025. 6. 13. 17:08

객체 지향 프로그래밍이란 ? 

프로그래밍에서 필요한 데이터를 추상화시켜서 상태와 행위를 가진 객체로 만들고 객체들간 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다. 

 

객체 지향 프로그래밍의 특징으로는 크게 추상화, 캡슐화, 상속, 다형성  4가지로 나뉜다. 

■ 추상화

 

 

■ 상속

: 상속이란, 기존의 클래스를 확장해서 새로운 클래스를 이끌어내는 것으로 기존 코드를 재사용해서 불필요한 코드를 재작성하는 번거로움 없이 새로운 클래스를 만드는 시간을 줄인다. 

JAVA에서 상속은 단일 상속만 가능하다. ( = 동시에 부모가 둘이 될 수 없다. )  
즉, 클래스가 다른 두 개 클래스를 동시에 상속 받을 수 없다.

WHY ? 
만약 단일 상속이 아니라 부모가 둘 이상인 경우 → 부모 모두 같은 이름의 메서드를 가지고 있으면 누가 가지고 있는 메소드를 상속받을지 알 수 없어서 문제가 발생한다. 

코드

○ 상속받을 때 사용하는 키워드는 extends 입니다.
○ 상속 관계를 is a 관계라고 부릅니다. 
  ▶ 자식 is a 부모 ( → 자식이 부모보다 자세하다. 부모는 자식보다 일반적이다. ) 
○ 생성자는 상속이 불가능하다. 
○ final 클래스는 상속이 불가능하다. ( 자식을 가질 수 없고 오직 객체 생성해서만 사용이 가능함 )
○ abstract 클래스는 반드시 상속해서 사용해야 한다. 
○ 부모가 가지고 있는 public 변수와 메서드는 자식이 사용 가능하다. 

 

 

 

■ 다형성 

: 다형성이란, 여러 형태를 가진다는 의미로 하나의 객체가 여러 가지 유형으로 사용되는 것을 의미한다. 
이때, 다형성은 반드시 상속을 전제조건으로 상속을 통해 생성된 클래스는 계층 내에서 동일한 메시지라도 어떤 객체에게 전달되는지에 따라서 다양한 동작이 발생한다.

코드

다형적 객체 : 하나의 변수가 여러 유형으로 사용된다.
 
  

 

 

 

캡슐화와 은닉이 헷갈릴 수 있지만 둘은 엄연히 다른 개념이다. 

→ 캡슐화는 객체가 가지는 상태와 행위의 연관성을 높여서 응집도를 높인다.
은닉은 외부에서 해당 객체를 접근할 때 객체의 상태에 대한 접근 최대한 막는다. 

■ 캡슐화

■ 은닉 

: 은닉이란, 데이터를 해당 데이터 처리하는 메서드와 함께 하나의 단위로 묶어서 처리하는 방식이다. 

HOW ?

하나의 단위로 묶어서 내부 데이터를 외부로부터 숨기고 외부에서는 정의된 특정 메서드만 활용해서 접근 가능하도록 처리해 시스템 안전성과 유지보수성을 향상시킨다. 

코드

 

■ 접근제한자

 

■ static

 

final 

 

final은 상속할 수 없는 클래스이다. 쉽게 말하면 자식 클래스를 가질 수 없으니까 오직 객체 생성을 통해서만 사용이 가능하다. 즉, final으로 선언된 클래스는 다른 클래스의 하위 클래스가 될 수 없다.
기억해야할 특징에 대해서 정리해보면 아래와 같다. 

클래스에 final이 붙으면 상속 불가능
method final이 붙으면 재정이 안됨
변수에 final이 붙으면 값 수정이 안됨 
abstract과 반대 개념이기때문에 동시 사용 불가능 
○ 지역 클래스에서 지역 변수 참조하기 위해서는 외부 클래스의 참조하고자 하는 지역 변수( 파라미터변수)가 변경되면 안됨

JAVA8부터는 final을 꼭 붙이지 않아도 가능하게 변경됨!!! ( 단, 이경우도 동일하게 값을 수정하거나 재정의가 불가능함 )

package ch07.final_;

public class FinalLocalVarExample {
	
	public int data = 100;
	
	public static void main(String[] args) {
		
		new FinalLocalVarExample().doIt("홍길동");
	}

	public void doIt(final String name) {
		final int age = 30;
		
		class InnerLocal{
			public void InnerDoIt() {
				System.out.println("외부클래스의 멤버변수 :" + data);
				System.out.println("외부클래스의 파라미터 변수 :" + name);
				System.out.println("외부클래스의 지역변수 age :" + age);
			}
		}
		new InnerLocal().InnerDoIt();
	}
	

}

위 코드에 대해서 설명하면, 아래와 같다.
스택 안에 name,age,innerLocal이 doit으로 위치하고, innerDoit()이라는 메서드도 stack에 위치한다. innerDoit()에서 name,age들을 읽어야하는데 스택에서는 불가능함. 그래서 final을 붙여두면 그 값들을 heap 영역에 그대로 복사해두기로 약속함 그래서 final을 붙인 name과 age 값을 heap 영역을 참조(?)해서 값을 읽을 수 있다. → 대신 그 값들은 수정이나 재정의가 불가능하다! 

 

abstract   

: 위에서 설명한 내용인 final과 반대되는 개념의 제한자이다. 

주로 클래스와 메서드에 주로 사용되는 제한자이다. 각각 클래스와 메소드별 기억해야할 특징에 대해서 정리해보면 아래와 같다. 


Class ( 클래스 )

1. 객체 생성할 수 없다.
→ 객체 생성이 되지 않기 때문에 사용하기 위해서는 반드시 상속받아서 하위 클래스에서 상속받은 abstract 클래스의 abstract 메서드 구현해야한다.

2. 추상 클래스이다.

3. 반드시 상속 받아서 사용해야한다.

 

Method ( 메서드 )

1. 추상 메서드이다. 
→ 추상 메서드를 하나라도 포함하는 클래스는 추상 클래스가 되어야함 ( 단, 추상클래스가 반드시 추상메서드 가질 필요는 없다. )

2. 메서드 구현 부분이 없다.

 

인터페이스 

인터페이스란, 기능의 명세를 위해서 사용하는 것이다. 즉, 클래스는 숨기면서 우리가 가지고 있는 기능을 노출시키는 역할을 한다. 
주로 클 기억해야할 특징에 대해서 정리해보면 아래와 같다. 

인터페이스는 다중 상속을 위해서 만들었다.
인터페이스의 변수는 상수 변수만 가질 수 있다.
○ 콤마( , )로 구분해서 여러개의 인터페이스 구현이 가능하다.
인터페이스 메서드는 항상 public 접근 제한자를 갖는다. 


ex ) '개' 라는 클래스는 '애완동물'을 구현해서 사용한다고 표현할 수 있다. 

class Dog implements Pet{ }

// 여기서 말하는 구현이란 인터페이스를 사용하는것을 의미한다.

 

 

※ 인프런_기초부터 시작하는 자바 프로그래밍(자바전문자그룹) 강의 수강 후 정리한 내용입니다.