7주 차 자바 수업 - SangwooRyou/26_Java GitHub Wiki

객체란?

  • 세상에 존재하는 모든 물체.
  • 객체마다 고유한 특성(state)과 행동(behavior)를 가짐.
  • 자바는 class라는 틀 안에 필드(변수)와 메소드로 구성.
  • Person.java
public class Person {
	// field (variable)
	String name;
	int age;
	char abc;
	
	// method
	public void 밥먹기() {
		System.out.println("밥먹기");
	}
	
	public void 운동하기(String 종목) {
		System.out.println(종목 + "을/를 합니다.");
	}
}
  • PersonTest.java
public class PersonTest {

	public static void main(String[] args) {
		// Person 객체 생성하기
		Person hong = new Person(); // 생성자 → 인스턴스 생성
		hong.name = "홍길동";
		hong.age = 20;
		hong.abc = 'A';
		hong.밥먹기();
		hong.운동하기("런닝");
		
	}

}
  • 인스턴스는 여러 개 생성할 수 있음.
Person kim = new Person();
		kim.name = "김철수";
		kim.age = 25;
		kim.abc = 'B';
		kim.밥먹기();
		kim.운동하기("하키");
  • 참고로 접근 지정자를 public으로 지정하지 않으면, 다른 클래스에서 사용할 수 없음.

✅ 생성자

  • 클래스 이름과 동일한 특별한 메소드.
  • 객체 생성 시 자동으로 한 번 호출됨.
  • 초기화하는데 필요한 코드 작성.
  • (.name, .age 같이 일일히 지정하지 않으려고 사용.)
Person hong = new Person();
  • 여기서 Person 클래스와 이름이 동일한 Person()이 사용됨.
  • 이때 매개변수가 없는 형태를 "기본 생성자"라고 함.
  • 따로 메소드 형태를 만들지 않더라도 컴파일러가 자동 처리함.
  • 단, 생성자를 선언해 놨다면 자동으로 생성하지 않음.

생성자의 역할

  • 객체를 생성하는 동시에 변수를 초기화함.
  • 위에서 hong이라는 객체를 만들어 일일히 초기화하지 않고, Person 클래스의 생성자에서 아래와 같이 사용 가능.
public Person() {
		name = "홍길동";
		age = 20;
		abc = 'A';
		System.out.println("객체 생성 완료");
	}
```java
Person hong = new Person(); // default 생성자
//		hong.name = "홍길동";
//		hong.age = 20;
//		hong.abc = 'A';
  • PersonTest에서 따로 초기화하지 않아도 똑같이 동작.

하나의 파일에서 생성자 사용하기

메인 함수가 존재해야 함.

  • Circle 클래스 부분
class Circle{
	public int radius;
	public String name;
	
	// 기본 생성자
	Circle(){ 
		radius = 10;
		name = "";
	}
	
	public double getArea() {
		return 3.14 * radius * radius;
	}
}
  • Pizza 메인 영역
public class Pizza {

	public static void main(String[] args) {
		// 1. 레퍼런스 변수 pizza 선언.
		Circle pizza;
		// 2. Circle 객체 선언.
		pizza = new Circle();
		// 3. 피자의 반지름 10으로 설정.
		pizza.radius = 10;
		// 4. 피자 이름 불고기 피자로 변경.
		pizza.name = "불고기 피자";
		// 5. 피자의 면적 메소드 호출하여 알아내기. 
		System.out.println(pizza.getArea());
		
	}

}
  • pizza 같은 참조(지역) 변수는 스택, 동적 메모리 영역은 힙에 저장.
  • new Circle()은 객체 자체가 힙에 저장되기에 Circle의 모든 내용이 힙에 저장됨.

인자 생성자 사용

class Circle{
	public int radius;
	public String name;
	
	// 기본 생성자
	Circle(){ 
		radius = 10;
		name = "";
	}
	
	// 인자(매개변수 2개) 생성자
	public Circle(int r, String n) {
		radius = r;
		name = n;
	}
	
	public double getArea() {
		return 3.14 * radius * radius;
	}
}
  • 오버라이딩을 이용해 Circle 클래스 속 매개변수 2개를 가진 Circle 함수 선언.
Circle pizza2;
pizza2 = new Circle(15, "치즈피자");
System.out.println(pizza2.name);

예제 : Book class

public class Book {
	String title;
	String author;
	
	public Book(String t) {
		title = t;
		author = "작자 미상";
	}
	
	public Book(String t, String a) {
		title = t;
		author = a;
	}
	
	public static void main(String[] args) {
		Book littlePrince = new Book("어린왕자", "생텍쥐페리");
		Book loveStory = new Book("춘향전");
		
		System.out.println(littlePrince.title + " " + littlePrince.author);
		System.out.println(loveStory.title + " " + loveStory.author);
	}

}

this

자기 자신 레퍼런스

this()

  • 생성자를 가리킴.
this("", ""); 
  • 위 형태처럼 사용 시 클래스 속에서 매개 변수가 2개인 생성자를 가리킴.
  • 단, 맨 처음에 존재해야 하며, 인자가 많은 함수로 넘겨야 함.
Circle(){ 
		this(0, "");
	}
	
	Circle(int n){
		this(n, "불고기 피자");
	}
	
	// 인자(매개변수 2개) 생성자
	public Circle(int r, String n) {
		radius = r;
		name = n;
	}
  • 위와 같이 선언 시 단일 인자로 호출해도 입력된 숫자와 초기화된 "불고기 피자"가 인자를 두 개 갖는 Circle()을 지정해 자동으로 사용 가능.
Circle pizza3 = new Circle(1);
System.out.println(pizza3.name);

// 출력 : 불고기 피자

객체 배열

public class CircleArray {

	public static void main(String[] args) {
		// 객체 배열 생성
		Circle c[];
		c = new Circle[5];

		for (int i = 0; i < c.length; i++) {
			c[i] = new Circle(i);
		}

		for (int i = 0; i < c.length; i++) {
			System.out.print((int)c[i].getArea() + " ");
		}

	}

}
  • 배열은 같은 자료형끼리 저장하며, Circle이라는 객체를 가져와 배열로 사용 가능.
public class BookArray {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		Book[] book = new Book[2];
		
		for(int i=0; i<book.length; i++) {
			System.out.print("제목 > ");
			String title = sc.nextLine();
			System.out.print("저자 > ");
			String author = sc.nextLine();
			
			book[i] = new Book(title, author);
		}
		
		for(int i=0; i<book.length; i++) {
			System.out.println("(" + book[i].title + ", " + book[i].author + ")");
		}
	}

}
  • Book 클래스와 연계

🗑️ 가비지 컬렉터

  • 사용되지 않는 객체의 메모리를 지움.

패키지

  • 같은 패키지 내에서 모든 클래스가 접근 가능함.

접근 지정자

  • 사용 목적 : 중요한 내용을 보호하기 위함!
  • 정보 은닉을 위해 ... : 캡슐화 💊
  • 완벽 차단 : private
  • 동일 패키지에 허용 : default
  • 동일 패키지와 자식 클래스에 허용 : protected
  • 모든 클래스에 허용 : public

객체 지향의 특징

1. 추상화 (abstraction)

  • 필요한 내용만 표현.