2-01. 객체와 객체 지향 프로그래밍

객체(Object)
객체를 정의 -> 기능 구현 -> 각 객체간의 협력을 구현

2-02. 생활 속에서 객체 찾아 클래스로 구현해 보기

  • 객체 생성 예시
public class Student { 
	int studentNumber; 
    String studentName;
    ...
  1. 객체를 정의
  2. 각 객체의 속성을 멤버 변수로 역할을 메서드로 구현
  3. 각 객체간의 협력을 구현
  • 클래스는 대문자로
  • public class는 파일에 하나! class 자체는 여려 개 구현 가능

2-03. 함수와 메서드

  • 함수 생성 예시
int add(int num1, int num2) {
		
	int result;
	result = num1 + num2;
	return result;
}

메서드(method)

  • 객체의 기능을 구현하기위해 클래스 내부에 구현되는 함수

2-04. 객체의 속성은 멤버 변수로, 객체의 기능은 메서드로 구현한다

2-05. 인스턴스 생성과 힙 메모리 (heap memory)

인스턴스 (instance)

  • new 키워드를 사용하여 클래스를 메모리에 생성한 상태
  • 생성된 인스턴스는 Heap 메모리 (동적 메모리)에 할당됨

2-06. 생성자에 대해 알아봅시다 (constructor)

  • 객체를 생성할 때 new 키워드와 함께 사용 - new Student();
  • 생성자는 반환 값이 없고, 클래스의 이름과 동일
...
Student studentLee = new Student(12345, "Lee", 3);
...
public class Student {

	public int studentNumber;
	public String studentName;
	public int grade;
	
	public Student(int studentNumber, String studentName, int grade) {
		this.studentNumber = studentNumber;
		this.studentName = studentName;
		this.grade = grade;
	}

2-07. 여러가지 생성자를 정의하는 생성자 오버로딩 (overloading)

  • 생성자는 여러개 구현 가능
public class UserInfo {

	public String userId;
	public String userPassWord;
	public String userName;
	public String userAddress;
	public String phoneNumber;
	
	public UserInfo(){}
	
	public UserInfo(String userId, String userPassWord, String userName) {
		this.userId = userId;
		this.userPassWord = userPassWord;
		this.userName = userName;
	}

2-08. 복습해봅시다 (객체 구현하기)


2-09. 참조 자료형 변수

2-10. 접근 제어 지시자(access modifier)와 정보은닉(infomation hiding)

접근 제어 지시자(access modifier)

  • private : 같은 클래스 내부에서만 접근 가능
  • default : 같은 패키지 내부에서만 접근 가능 (상속 관계라도 패키지가 다르면 접근 불가)
  • protected : 같은 패키지, 상속관계의 클래스에서 접근 가능
  • public : 클래스 외부 어디에서나 접근 가능

get()/ set() 메서드
private 으로 선언된 멤버 변수 (필드)에 대해 접근, 수정할 수 있는 메서드를 public으로 제공

정보 은닉
객체 오류를 방지하고 더 효율적인 객체 활용을 위해 외부에서 접근 가능한 정보를 최소화

package ch10;

public class BirthDay {
	
	private int day;
	private int month;
	private int year;
	
	private boolean isValid;
	
	public int getDay() {
		return day;
	}
	
	public void setDay(int day) {
		switch(month){
			case 1: case 3: case 5: case 7: case 8: case 10: case 12:
				if(day < 1 || day > 31) {
					isValid = false;
				} else {
					isValid = true;
					this.day = day;
				}
				break;
			case 2: 
				if(day < 1 || day > 28) {
					isValid = false;
				} else {
					isValid = true;
					this.day = day;
				}
				break;
			case 4: case 6: case 9: case 11:
				if(day < 1 || day > 30) {
					isValid = false;
				} else {
					isValid = true;
					this.day = day;
				}
				break;
		};
	}
	
	public int getMonth() {
		return month;
	}
	
	public void setMonth(int month) {
		if( month < 1 || month > 12)
		{
			isValid = false;
		} else {
			isValid = true;
			this.month = month;
		}
		
	}
	
	public int getYear() {
		return year;
	}
	
	public void setYear(int year) {
		this.year = year;
	}
	
	public void showDate() {
		if(isValid) {
			System.out.println(year + "년 " + month + "월 " + day + "일 입니다.");
		} else {
			System.out.println("유효하지 않은 날짜입니다.");
		}
	}
	
}

2-11. 캡슐화 (encapsulation)

꼭 필요한 정보와 기능만 외부에 오픈함
각각의 메서드나 멤버 변수를 접근함으로써 발생하는 오류를 최소화

2-12. 객체 자신을 가리키는 this

this
인스턴스 자신의 메모리를 가리킴

2-13. 객체 간의 협력 (collabration)

객체 간에는 협력이 이루어짐

2-14. 버스 타고 학교 가는 학생의 과정을 객체 지향 프로그래밍으로 구현해보기

public class Student {
	
	String studentName;
	int money;
	
	public Student(String studentName, int money) {
		this.studentName = studentName;
		this.money = money;
	}
	
	public void takeBus(Bus bus) {
		bus.take(1000);
		this.money -= 1000;
	}
	
	public void takeSubway(Subway subway) {
		subway.take(1200);
		this.money -= 1200;
	}
	
	public void showInfo() {
		System.out.println(studentName + "님의 남은 돈은 " + money + "원 입니다");
	}
}

public class Bus {
	
	int busNumber;
	int passengerCount;
	int money;
	
	public Bus(int busNumber) {
		this.busNumber = busNumber;
	}
	
	public void take(int money) {
		this.money += money;
		passengerCount++;
	}
	
	public void showBusInfo() {
		System.out.println(busNumber + "번 버스의 승객은 " + passengerCount + "명 이고, 수입은 " + money + "원 입니다");
	}
}

public class Subway {
	
	int lineNumber;
	int passengerCount;
	int money;
	
	public Subway(int lineNumber) {
		this.lineNumber = lineNumber;
	}
	
	public void take(int money) {
		this.money += money;
		passengerCount++;
	}
	
	public void showSubwayInfo() {
		System.out.println(lineNumber + "번 지하철의 승객은 " + passengerCount + "명 이고, 수입은 " + money + "원 입니다");
	}
}

public class TakeTransTest {

	public static void main(String[] args) {
		Student studentJ = new Student("James", 5000);
		Student studentT = new Student("Tomas", 10000);
		
		Bus bus100 = new Bus(100);
		Subway subwayGreen = new Subway(2);
		
		studentJ.takeBus(bus100);
		studentT.takeSubway(subwayGreen);
		
		studentJ.showInfo();
		studentT.showInfo();
		
		bus100.showBusInfo();
		subwayGreen.showSubwayInfo();
	}

}

2-15. 복습해봅시다 (객체 협력)



public class Taxi {
	
	String taxiName;
	int money;
	
	public Taxi(String taxiName) {
		this.taxiName = taxiName;
	}
	
	public void take(int money) {
		this.money += money;
	}
	
	public void showTaxiInfo() {
		System.out.println(taxiName + " 수입은 " + money + "원 입니다.");
		
	}
	
}

public class Student {
...
public void takeTaxi(Taxi taxi) {
		taxi.take(10000);
		this.money -= 10000;
	}
}

public class TakeTransTest {
...
Student studentE = new Student("Edward", 20000);
		Taxi newTaxi = new Taxi("잘 간다 운수택시");
		
		studentE.takeTaxi(newTaxi);
		
		studentE.showInfo();
		newTaxi.showTaxiInfo();
        }

2-16. 여러 인스턴스에서 공통으로 사용하는 변수를 선언하자 - static 변수

여러 인스턴스가 공유하는 기준 값이 필요한 경우
ex) 학번, 사번 등등

static int serialNum~

2-17. static메서드의 구현과 활용, 변수의 유효 범위

  • static 메서드에서는 인스턴스 변수를 사용할 수 없음
  • 멤버 변수가 많으면 인스턴스 생성 시 쓸데없는 메모리가 할당됨

2-18. static 응용 - 싱글톤 패턴(singleton pattern)

인스턴스가 한 개만 생성되어야 하는 경우 사용하는 디자인 패턴

2-19. 복습해봅시다 (static과 싱클톤 패턴)

public class Car {
	
	public static int serialNumber = 10000;
	private int carNum;
	

	public int getCarNum() {
		return carNum;
	}

	public void setCarNum(int carNum) {
		this.carNum = carNum;
	}

	public Car() {
		serialNumber++;
		carNum = serialNumber;
	}
	
}
public class CarFactory {
	
	public static CarFactory instance = new CarFactory();

	public CarFactory() {
		
	}
	
	public static CarFactory getInstance() {
		if( instance == null) {
			instance = new CarFactory();
		}
		return instance;
	}
	
	public Car createCar() {
		Car car = new Car();
		return car;
	}
	
}

2-20. 자료를 순차적으로 한꺼번에 관리하는 방법 - 배열(array)


2-21. 객체 배열 사용하기

객체 배열의 경우엔 요소가 되는 객체의 주소가 들어갈(4바이트, 8바이트) 메모리만 할당

객체 배열 복사하기

  • System.arrayCopy(src, srcPos, dest, destPos, length)

** 얕은 복사

  • 객체 주소만 복사 -> 한 요소를 수정하면 같이 수정 됨
...
System.arraycopy(library, 0, copyLibrary, 0, 5);
...

** 깊은 복사

...
copyLibaray[0] = new Book();
		copyLibaray[1] = new Book();
		copyLibaray[2] = new Book();
		copyLibaray[3] = new Book();
		copyLibaray[4] = new Book();
		
		for(int i = 0; i< library.length; i++) {
			copyLibaray[i].setTitle(library[i].getTitle());
			copyLibaray[i].setAuthor(library[i].getAuthor());
		}
		
		
		library[0].setTitle("나목");
		library[0].setAuthor("박완서");
...

2-22. 2차원 배열 사용하기

int[][] arr = new int[2][3];
자료형 배열이름 = new 자료형[행개수][열개수]

2-23. 객체 배열을 구현한 클래스 ArrayList

StudentTest

Student

Subject

0개의 댓글