IT/JAVA

[Day 9] JAVA 객체

_KH_ 2025. 1. 10. 17:26

[객체지향프로그래밍(OOP)]---> 객체지향언어인 "JAVA" 를 사용

 

[객체지향언어] -> 메서드에게 주어(주체)가 생기는 것

 

[객체지향언어의 4가지 특징]

1. 추상화 : 객체들의 공통되는 특징을 코딩할 수 있다! 객체들의 설계(틀)를 제공할 수 있다!

 

2. 정보은닉

   1) 새로운 것을 개발할 때, 기존의 것을 그대로 활용할 수 있음
   --> 기존의 것이 어떤 기능을 하는지만 알면 된다!
   기존의 것에 대한 성분분석 X(알면 좋음)

 
   2)  개발 이후 이슈가 발생했을 때, 접합부분만 검사하면 된다.
--> 개발 시간 / 비용 단축 (함수를 쓰는 이유와 동일.)
==> 유지보수 용이 ★

 

3. 상속 : 개발완료된 코드를 새로 개발하는 코드에 전부 가져올 수 있음

 

4.  다형성 : 함수(메서드)를 수행하는 주체(주어, 수행대상)가 어떤 객체인지에 따라 다른 수행결과가 나올 수 있다! ★★★★★

ex ) add() --> 절차지향언어에서는 함수 수행결과를 바꿀 수 없다. 하지만 객체지향은 가능

강아지.울음() 멍멍, 고양이.울음() 야옹 
--> 객체지향언어에서는 메서드 수행결과가 다를 수 있다. (함수 앞에 대상이 붙음)

 

[클래스(class)] : 기본단위. 객체를 생성하기 위한 틀이자 하나의 자료형처럼 쓰인다.

ex. 포켓몬, 학생, 자동차 등..

 

[객체] : 클래스를 통해 생성되는 것. 

ex. 피카츄, 파이리, 홍길동 .. 

 

[생성자] : 객체의 멤버 변수를 초기화함. 객체를 생성하면서 초기화 해준다.

■ 특징 : 기본 생성자 제공, 클래스명과 생성자 동일

■ 자바는 인자가 없는 생성자, 즉 디폴트 생성자를 기본으로 제공해준다. (선언을 하지 않아도 쓸 수 있는 유일한 함수)

  하지만, 개발자가 매개변수가 있는 생성자를 단 하나라도 생성해줄 시 기본 생성자를 기본으로 생성하지 않는다.

■ 생성자는 수행결과, 객체를 무조건 반환하기 때문에 output을 따로 기입하지 않는다.

생성자 오버로딩 : 같은 이름을 가진 생성자를 매개변수의 타입과 인자를 달리하여 여러 개 생성함.

   ---> 기본 생성자를 사용할 수 없다. 기본 생성자를 따로 선언해줘도 OK

 

예를 들어, 회원가입 란을 만들 때 필수적인 정보가 있고, 아닌 것이 있는데 필수정보인 것만 받아서 회원정보를 생성하도록 매개변수를 가진 생성자를 생성할 수 있다.

 

[this] : "자기 자신 객체"

class Student {
	String name;
	int score;
}


라는 클래스가 있을 때, 

Student(String name) {
	name = name;
}


 하면 student 클래스가 가지는 name을 받아오는 name으로 생성하는건데 변수명이 동일해 둘 다 받아오는 name으로 인식하기 때문에 this.name = name; 을 이용해 객체가 가지는 자기 자신 객체 name에 받아온 name을 대입하는거라고 구분해준다.

 

 

point.x ~ 이런식으로 써야 안에 있는 값 확인 가능

point는 객체라서 힙 메모리에 저장된 주소(해시코드)가 나옴

 

 

[객체 문제 풀이]

1) 원 클래스를 선언해주세요. 원 객체들은 이름과 반지름, 넓이를 가집니다. 넓이는 반지름x반지름x3.14로 계산합니다.
예를들어,도넛은(는) 반지름이 1입니다. 도넛의 넓이는 3.14입니다. 피자은(는) 반지름이 10입니다. 피자의 넓이는 314.0입니다.

 

package class06;

class Circle {
	String name;
	int radius;
	double area;
	
	Circle(String name,int radius) {
		this.name=name;
		this.radius=radius;
		this.area=this.radius*this.radius*3.14;
	}
	
	void printCircleInfo() { // 클래스 속 메소드 선언 방법 알아두기
		System.out.println("원 이름 : "+this.name);
		System.out.println("반지름 : "+this.radius);
		System.out.println("넓이 : "+this.area);
	}
}

public class Test01T {
	public static void main(String[] args) {
		Circle c1=new Circle("도넛",1);
		Circle c2=new Circle("피자",10);

		c1.printCircleInfo(); // 함수화 이용하기
		c2.printCircleInfo();
	}
}

멤버변수 초기화는 생성자의 역할이므로, 클래스 내에서 멤버변수 초기화 하지 않기

 

2) 책 객체들을 저장하고싶습니다. 책이란, 제목과 작가로 구성되어있습니다.
만약 작가를 알수없는 책이라면 작가의 이름을 작자미상으로 설정해주세요.

class Book {
   String title;
   String writer;
   Book(String title){
      this.title=title;
      this.writer="작자미상";
   }
   Book(String title,String writer){
      this.title=title;
      this.writer=writer;
   }
}

public class Test02 {
   public static void main(String[] args) {
      
      Book book01=new Book("해리포터","JK롤링");
      Book book02=new Book("춘향전");
      
      System.out.println(book01.title+" "+book01.writer);
      System.out.println(book02.title+" "+book02.writer);
      
   }
}​

 

3) 상품 객체들을 다룰 예정입니다. 상품은 이름,가격,재고가 있습니다.
만약 재고를 설정하지 않으면 0개가 기본설정되도록 해주세요.

package class06;

class Product {
	String name;
	int price;
	int count;
	Product(String name,int price) {
		this.name=name;
		this.price=price;
		this.count=0;
	}
	Product(String name,int price,int count) {
		this.name=name;
		this.price=price;
		this.count=count;
	}
}

public class Test03 {

}

 

4) 자동차 클래스를 구현해주세요. 자동차는 현재 속도를 보여줄 수 있고,
모든 자동차들은 최대 속도가 120을 넘길수없습니다.

 

[내가 작성한 코드]

package class06;

class Car {
	String name;
	int speed;

	Car(String name, int speed) {
		this.name = name;
		this.speed = speed; 

//		if(speed > 120) {
//			this.speed = 120;
//		}
	}
}

public class Test04 {

	public static void main(String[] args) {

		Car car01 = new Car("쏘나타", 80);
		Car car02 = new Car("제네시스", 150);

		if(!isRight(car01.name, car01.speed)) {
			System.out.println(car01.name + "의 속도는 " + car01.speed + "km 입니다.");
		}

		if(!isRight(car02.name, car02.speed)) {
			System.out.println(car02.name + "의 속도는 " + car02.speed + "km 입니다.");}
		System.out.println(car02.speed);

	}

	public static boolean isRight(String name, int speed) {
		if(speed > 120) {
			System.out.println(name +"의 속도를 " + speed + "km로 입력하셨습니다. \n최대 속도는 120을 넘길 수 없습니다! 속도가 120km로 제한됩니다." );
			speed = 120;
			return true;
		}
		return false;
	}
}

 

[강사님 코드]

package class06;

class Car2 {
	int currSpeed;
	int maxSpeed;

	Car2(int currSpeed) {
		this.currSpeed = currSpeed;
		this.maxSpeed = 120;

		if(this.currSpeed > this.maxSpeed) {
			this.currSpeed = this.maxSpeed;
			System.out.println("모든 자동차들은 최대 속도가 " + this.maxSpeed + "을 넘길 수 없습니다.");
		}
	}
}

public class Test04T {
	
	public static void main(String[] args) {
	}
}

어떻게 해야할지 많이 고민했던 문제...

 

 

 

메인 함수를 최대한 건드리지 않으면서 최대한 함수화 하는 연습하기!!!

'IT > JAVA' 카테고리의 다른 글

Java Section 07 : 클래스  (0) 2025.01.14
[Day 10] 객체와 생성자  (0) 2025.01.13
[JAVA] 배열, 함수, 삽입정렬  (0) 2025.01.08
Java Section 06 : 배열  (0) 2025.01.07
[Day 7] 함수  (1) 2025.01.07