2022/02/14 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online.

김석진·2022년 2월 14일
0

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

접근 제어 제시자(accress modifier)

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

get()/set() 메서드

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

정보은닉

  • private으로 제어한 멤버 변수도 public 메서드가 제공되면 접근 가능하지만 변수가 public으로 공개되었을 때 보다 private 일때 각 변수에 대한 제한을 public 메서드에서 제어할 수있다.
  • 객체 지향 프로그램에서 정보 은닉은 필요한 외부에서 접근 가능한 최소한의 정보를 오픈함으로써 객체의 오류를 바지하고 클라이언트 객체가 더 효율적으로 객체를 활용할 수 있도록 해준다.

캡슐화(encapsulation)

정보 은닉을 활용한 캡슐화

  • 꼭 필요한 정보와 기능만 외부에 오픈함
  • 대부분의 멤버 변수와 메서드를 감추고 외부에 통합된 인터페이스만은 제공하여 일관된 기능을 구현하게 함
  • 각각의 메서드나 멤버변수를 접근함으로써 발생하는 오류를 최소화한다.
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-2222-3333\n");
		
		buffer.append("Tomas \t");
		buffer.append("NewYork US \t");
		buffer.append("010-7777-0987\n");
	}
	
	private void makeFooter()
	{
		
		buffer.append(line);
	}
	
	public String getReport()
	{
		makeHeader();
		generateBody();
		makeFooter();
		return buffer.toString();
	}
}
public class TestReprt {

	public static void main(String[] args) {

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

}

객체 자신을 가리키는 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;
	}
}

객체 간의 협력(collaboration)

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

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

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

버스와 지하철을 타는 예제 프로그래밍

James와 Tomas는 각각 버스와 지하철을 타고 학교에 갑니다.
James는 5000원을 가지고 있었고, 100번 버스를 타면서 1000원을 지불합니다.
Tomas는 10000원을 가지고 있었고, 초록색 지하철을 타면서 1200원을 지불합니다.
두 학생이 버스와 지하철을 타는 상황을 구현해 봅시다

Student

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);
    }
}

Subway

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

Bus

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 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);
        studentJ.takeBus(bus100);

        Subway greenSubway=new Subway(2);
        studentT.takeSubway(greenSubway);

        studentJ.showInfo();
        studentT.showInfo();
        bus100.showBusinfo();
        greenSubway.showSubwayinfo();
    }
}

실행결과

profile
주니어 개발자 되고싶어요

0개의 댓글