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)
- 필요한 내용만 표현.