본문 바로가기
Java

Java 객체 지향 입문 / 접근 제어 지시자, 정보은닉, this, 객체간의 협력

by 리잼 2022. 11. 9.
반응형

10. 접근 제어 지시자( access modifier ), 정보은닉( information hiding )

접근 제어 지시자

  • 클래스 외부에서 클래스의 멤버 변수, 메서드, 생성자를 사용할 수 있는지 여부를 지정하는 키워드
  • private : 같은 클래스 내부에서만 접근 가능 ( 외부 클래스, 상속 관계의 클래스에서도 접근 불가 )
  • 아무것도 없음 ( default ) : 같은 패키지 내부에서만 접근 가능 ( 상속 관계라도 패키지가 다르면 접근이 불가함 ) 
  • protected : 같은 패키지나 상속 관계의 클래스에서 접근 가능하고 그 외 외부에서는 접근 할 수 없음
  • public : 클래스의 외부 어디서나 접근 할 수 있음

get() , set() 메서드

  • private 로 선언된 멤버 변수 ( 필드 )에 대해 접근, 수정할 수 있는 메서드를 public으로 제공
  • get() 메서드만 제공되는 경우 read-only 필드
  • 이클립스에서 자동으로 생성 됨

정보 은닉

  • private으로 제어한 멤버 변수도 public 메서드가 제공되면 접근 가능하지만 변수가 public으로 공개되었을 때보다
    private일 때 각 변수에 대한 제한을 public메서드에서 제어 가능함
  • 쓸데없는 데이터의 오용을 막기 위함

Birthday.java

public class BirthDay {

	private int day;
	private int month;
	private int year;
	
	private boolean isValid; // isValid의 기본값은 false다
	
	public int getDay() {
		return day;
	}
	public void setDay(int day) {
		this.day = day;
	}
	
	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) {
		if ( (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0) ) {
			isValid = true;
			System.out.println( year + "년은 윤년 입니다.");
		} else {
			isValid = false;
			System.out.println( year + "년은 평년 입니다.");
		}
		this.year = year;
	} 
    
    // 비교연산자 % < 나머지값, && A,B가 모두 참이어야 함, || A,B 둘중 한조건이 참이면 참
    // != NOT
	
	public void showDate() {
		if(isValid) {
			System.out.println(year + "년 " + month + "월 "+ day + "일");
		} else {
			System.out.println("유효하지 않은 날짜 입니다.");
		}
		
	}

}

BirthDayTest.java

public class BirthDayTest {

	public static void main(String[] args) {

		BirthDay date = new BirthDay();
		date.setYear(2012);
		date.setMonth(12);
		date.setDay(1);
		
	
		date.showDate();
		
	}

}

실습 후 윤년 계산을 추가해줬다.

월, 일은 Date 함수가 따로 있어서 .. 나중엔 이렇게 쓸일이 없으므로 생략.


11. 캡슐화

정보 은닉을 활용한 캡슐화

  • 꼭 필요한 정보와 기능만 외부에 포함
  • 대부분의 멤버 변수와 메서드를 감추고 외부에 통합된 인터페이스만은 제공하여 일관된 기능을 구현하게 함
  • 각각의 메서드나 멤버 변수를 접근함으로써 발생하는 오류를 최소화 한다.

레포트 만들기 예제

MakeReport.java

public class MakeReport {

	StringBuffer buffer = new StringBuffer(); // 문자열을 추가하거나 변경할떄 사용되는 자료형
	
	private String line = "=====================================\n";
	private String title = "이름\t주소\t\t전화번호\n";
	
	private void makeHeader() {
		buffer.append(line);
		buffer.append(title);
		buffer.append(line);
	} 
	
	private void generateBody()
	{
		buffer.append("James \t");
		buffer.append("Seoul Korea \t");
		buffer.append("010-1234-5678 \n");
		
		buffer.append("Tomas \t");
		buffer.append("Seoul Busan \t");
		buffer.append("010-1234-5622 \n");
	}
	
	private void makeFooter() {
		buffer.append(line);
	}
	
	public String getReport() {
		makeHeader();
		generateBody();
		makeFooter();
		return buffer.toString();
	}
	
}

MakeReportTest.java

public class MakeReportTest {

	public static void main(String[] args) {

		MakeReport builder = new MakeReport();
		String report = builder.getReport();
		
		System.out.println(report);
		
	}

}

12. this

this가 하는 일

  • 인스턴스 자신의 메모리를 가리킴
  • 생성자에서 또 다른 생성자를 호출 할 때 사용
  • 자신의 주소( 참조값 )을 반환함

생성된 인스턴스 메모리의 주소를 가짐

  • 클래스 내에서 참조변수가 가지는 주소 값과 동일한 주소 값을 가지는 키워드
public void setYear(int year){
	this.year = year;
}

생성자에서 다른 생성자를 호출하는 this

클래스에 생성자가 여러개 인경우, this를 이용하여 생성자에서 다른 생성자를 호출할 수 있음

생성자에서 다른 생성자를 호출하는경우, 인스턴스의 생성이 완전하지 않은 상태이므로 this() statement 이전에 다른 statement를 쓸 수 없음

public class Person {

	String name;
	int age;
	
	public Person() {
		this("이름 없음", 1);
	}
	
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	public void showPerson() {
		System.out.println(name + "," + age);
	}
	
	public static void main(String[] args) {
		Person person = new Person();
		person.showPerson();
		
	}
	
}

자신의 주소를 반환하는 this

public class Person {

	String name;
	int age;
	
	public Person() {
		this("이름 없음", 1);
	}
	
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	public void showPerson() {
		System.out.println(name + "," + age);
	}
	
	public Person getPerson() {
		return this;
	}
	
	public static void main(String[] args) {
		Person person = new Person();
		person.showPerson();
		
		System.out.println(person);
		
		Person person2 = person.getPerson();
		System.out.println(person2);
	}
	
}

13. 객체간의 협력 ( collabration )

객체지향 프로그래밍에서의 협력

  • 객체지향 프로그램에서 객체 간에는 협력이 이루어진다
  • 협력을 위해서는 필요한 메세지를 전송하고 이를 처리하는 기능이 구현되어야 함
  • 매개 변수로 객체가 전달되는 경우가 발생
  • 객체 협력의 예

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

Student.java

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 + "입니다.");
	}
	
}

Bus.java

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 + "원 입니다.");
	}
	
	
}

Subway.java

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 + "원 입니다.");
	}
}

TakeTransTest.java

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);
		Bus bus500 = new Bus(500);
		
		Subway subway1 = new Subway(1);
		Subway subway2 = new Subway(2);
		
		studentJ.takeBus(bus100);
		studentT.takeSubway(subway2);
		
		studentJ.showInfo();
		studentT.showInfo();
		
		bus100.showBusInfo();
		subway2.showSubwayInfo();
	}

}

15. 예제 복습 ( 객체 협력 )

앞의 예제에서 Edward는 지각을 해서 택시를 타야 했습니다. 
20000원을 가지고 있었는데 10000원을 택시비로 사용했습니다.
택시는 '잘나간다 운수' 회사 택시를 탔습니다.

Person.java

public class Person {

	String name;
	int money;
	
	public Person(String name, int money) {
		this.name = name;
		this.money = money;
	}
	
	public void takeTaxi(Taxi taxi) {
		taxi.takeTaxi(10000);
		money -= 10000;
	}
	
	public void showPersonInfo() {
		System.out.println(name + "의 남은 돈은 " + money + "원 입니다.");
	}
	
}

Taxi.java

public class Taxi {

	String taxiCompanay;
	int money;
	
	public Taxi(String taxiCompany) {
		this.taxiCompanay = taxiCompany;
	}
	
	public void takeTaxi(int money) {
		this.money += money;
	}
	
	public void showTaxiInfo() {
		System.out.println(taxiCompanay + "택시 수입은 " + money + "원 입니다.");
	}
	
}

TaxiTest.java

public class TaxiTest {

	public static void main(String[] args) {

		Person Edward = new Person("Edward", 20000);
		Taxi taxi = new Taxi("잘 나간다 운수");
		
		Edward.takeTaxi(taxi);
		Edward.showPersonInfo();
		taxi.showTaxiInfo();
	}

}

 

반응형