Dev/Java

객체 지향 프로그래밍이 뭘까?

OK-가자 2021. 9. 7. 18:49

먼저 글에 들어가기 전에 남궁성선생님의 자바의 정석 유튜브 강의 들으시면 객체지향을 이해하는데 정말 많은 도움이 됩니다.

https://www.youtube.com/user/MasterNKS

 


 

네이버 사전에 검색하면

 

"모든 데이터를 하나의 물체처럼 취급해서 프로그래밍 하는 방법."

이라고 한다.

 

정말 간단하고도 어렵다.

 

붕어빵, Tv, 물건(의인화) 로 객체지향을 공부하는데 음.... 객체지향의 정의는 잘 정리 되어있는 곳이 많아서 여기에는 오늘 수업에서 공부한 내용을 정리해야겠다.

 

객체 지향 프로그래밍 키워드 5가지

캡 추 다 정 상

정보처리기사(필기)시험 칠때 외웠던 것들이다.

 

캡슐화 추상화 다형성 정보은닉 상속

 

상속이란?

- 기존의 클래스를 재사용해서 새로운 클래스를 작성하는 것.

- 두 클래스를 조상과 자손으로 관계를 맺어주는 것.

- 자손은 조상의 모든 멤버를 상속받는다(생성자, 초기화블럭 제외)

- 자손의 멤버개수는 조상보다 적을 수 없다(같거나 많다.)

 

오버라이딩 이란?

"조상클래스로부터 상속받은 메서드의 내용을 상속받는 클래스에 맞게 변경하는 것을 오버라이딩이라고 한다."

* override -'~위에 덮어쓰다(overwrite).' . '~에 우선하다.'

 

오버로딩 이란?

기존에 없는 새로운 메서드를 정의하는 것

 

다향성이란?

 

- "여러 가지 형태를 가질 수 있는 능력"

- "하나의 참조변수로 여러 탑입의 객체를 참조할 수 있는 것"

   즉, 조상타입의 참조변수로 자손타입의 객체를 다룰 수 있는 것이 다형성

 

추상클래스(abstract class) 란?

- 클래스가 설계도라면 추상클래스는 '미완성 설계도'

- 추상메서드(미완성 메서드)를 포함하고 있는 클래스

- 일반 메서드가 추상메서드를 호출할 수 있다.(호출할 때 필요한 건 선언부)

- 완성된 설계도가 아니므로 인스턴스를 생성할 수 없다.

-다른 클래스를 작성하는 데 도움을 줄 목적으로 작성된다.

 

추상메서드(abstract method)란?

- 선언부만 있고 구현부가 없는 메서드

- 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우에 사용

- 추상클래스를 상속받는 자손클래스에서 추상메서드의 구현부를 완성해야 한다.

 

인터페이스란?

- 일종의 추상클래스, 추상클래스(미완성 설계도)보다 추상화 정도가 높다.

- 실제 구현된 것이 전혀 없는 기본 설계도

- 추상메서드와 상수만을 멤버로 가질 수 있다.

- 인스턴스를 생성할 수 없고, 클래스 작성에 도움을 줄 목적으로 사용된다.

- 미리 정해진 규칙에 맞게 구현하도록 표준을 제시하는 데 사용된다.


위의 내용들을 모두 종합적으로 사용한 연습 코드.

public class GoodApp {
	public static int i = 0;

	public static void test() {

	}

	public static void main(String[] args) {
		// Goods 클래스를 정의하고 GoodsApp 에서  Goods 클래스를 테스트 하세요.
		//1) Goods 객체를 하나 생성하고 이 객체에 대한 레퍼런스 변수를 camera 로 합니다.
		//2) 이 객체의 데이터인 각 각의 인스턴스 변수는 다음과 같은 값을 가지도록 합니다. 
		//상품이름 : “nikon”,   가격: 400,000, 재고개수: 30, 팔린 개수: 50
		//3) 값을 세팅 한 후,  객체의 값을 출력해 보세요.


		Goods camera = new Goods();

		camera.setCountSold(50);
		camera.setCountStock(30);
		camera.setName("Nikon");
		camera.setPrice(400000);

		System.out.println(camera);

		//제품 정보
		camera.showInfo();
		//Goods 클래스에 파라미터로 할인율을 입력 받고 반환 값으로 할인 가격을 반환하는 메소드를 구현하고 테스트 합니다.
		System.out.println(camera.calculateDiscountPrice(50)+"만원");

	}
}

 

public class Goods {
	
	//정보은닉을 위해 보통 클래스의 필드들은 private으로 지정합니다. Goods클래스의 필드들을 private으로 지정하고 생성된
	//객체의 인스탄스 변수의 값을 세팅하기 위한 setter getter 메소드들을 작성하고 테스트 합니다.

	private int price;
	private int countSold;
	private int countStock;
	private String name;
	
	//Goods 에 클래스 변수 countOfGoods를 추가 하고  공유변수로 사용하는 실습을 합니다.
	//생성자에서 증가 시키고  새 객체를 생성할 때 마다 값 변화를 확인합니다.
	//인스턴스 변수였을 때와 차이를 생각해 보고 이해하도록 합니다.  

	public static int countofGoods = 0;
		
	public Goods(int price, int countSold, int countStock, String name) {
		this();
		this.price = price;
		this.countSold = countSold;
		this.countStock = countStock;
		this.name = name;
	}

	public Goods() {
		countofGoods = countofGoods + 10;
	}
	
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	public int getCountSold() {
		return countSold;
	}
	public void setCountSold(int countSold) {
		this.countSold = countSold;
	}
	public int getCountStock() {
		return countStock;
	}
	public void setCountStock(int countStock) {
		this.countStock = countStock;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	//Goods의 정보를 화면에 출력하는 public void showInfo() 메서드를 작성하고 테스트 합니다.
	public void showInfo() {
		
		System.out.println(
				"상품이름 : " + name +
				", 가격 : " + price +
				", 재고개수 : " + countStock +
				", 팔린 갯수 : " + countSold
				);
		
	}
	//Goods 클래스에 파라미터로 할인율을 입력 받고 반환 값으로 할인 가격을 반환하는 메소드를 구현하고 테스트 합니다.
	public int calculateDiscountPrice(double percentage) {
		return (int)(price * percentage/100);
	}
	
}