day 9 - 객체지향,클래스

2022-03-14

클래스 - 객체를 만들기 위한 설계도

객체지향을 간단하게 말하면 설계도대로 분업하여 제작하는것이라고 할 수 있다.

객체지향 프로그래밍은 소프트웨어 상에서 분업화를 이루어냄으로써 쉬운 유지보수가 가능해진다.

이런 설계도를 소프트웨어적으로 만들어내는 양식이 바로 클래스이다.

클래스의 요소로는 속성(변수), 동작(메서드) 가 있는데 이는 아까 설명한 설계도와 비슷한 원리이다.

new 로 만들어진 모든 객체는 heap 메모리에 만들어지고 참조변수는 stack 메모리에 만들어진다.

클래스의 특징

  1. 추상화: 각 객체의 공통속성을 모아서 설계

예를들어 컴퓨터에 속한 모니터, 본체, 키보드, 마우스등을 객체라고 할 수 있고 각각의 객체를 만들어내기 위한 설계도가 있었을 것이다. 속성(상태) 는 변수, 행위(동작)은 메서드라고 할 수 있다. 그리고 그 안의 모든 요소들은 객체라고 할 수 있다.

  1. 은닉화: 객체가 갖는 중요한 속성을 외부로부터 숨긴다(접근제한자를 이용)
  2. 상속: 코드의 재사용(기존 객체기능을 돌려받아서 새로운 객체를 생성
  3. 다형성: 각 객체별로 명령을 전달하는 게 아니라 추상적 단계에서 명령을 전달한다.

Member Field

멤버필드는 heap 메모리 영역에 생성된다. 자동 초기화가 되기 때문에 설정을 해두어야한다.

기본값: (숫자: 0 논리형: false 참조변수: null)

private int hour ;
private int minute;
private int second;

Access Modifier (접근제한자)

public (공개모드)

protected (보호모드)

private (비공개모드)

default (생략)

public int year;
protected int month;
private int day;
int weekday;

위와 같이 4가지 객체를 만들었다.

in.year = 2022; // 공개모드
// in.month // 상속 받은 자식이나 동일 패키지가 아니면 사용할 수 없다.
// in.day // 비공개모드, 자신 외에는 사용 못함
// default : 동일 패키지일때만

다른 패키지에서 위 객체를 불러오려고 하자 이렇게 public 객체만 설정할 수 있다는 것을 확인할 수 있다. 그리고 또 한가지 중요한 점이 있는데,

객체지향에서는 변수를 중요한 속성으로 생각하기 때문에 외부에 쉽게 공개되지 않도록 한다.

객체를 가져오거나 값을 설정할 때 getter와 setter 메서드로 설정하여 값을 조정하도록 설정하면 객체 내 정보를 아무나 수정 할 수 없기 때문에 보안성이 강화된다

/////////메서드클래스

// setter 메서드 (변수에 값을 넣는 메서드)
// 형식: setField명(인자) <- camel case로 작성한다.
public void setDay(int d) {
 this.year = year;		
	}

// getter 메서드 (값을 가져오는 메서드)
// 형식은 setter와 같다.
public int getMonth() {
	return month;
}
/////////메인

// in.year = 2022; // 공개모드이지만 멤버 필드는 숨기는 것을 원칙으로 한다.
		in.setYear(2022);
		
		// in.month // 상속 받은 자식이나 동일 패키지가 아니면 사용할 수 없다.
		in.setMonth(3); 
		
		// in.day // 비공개모드, 자신 외에는 사용 못함
		in.setDay(14);
		
		// default : 동일 패키지일때만
		in.setWeekday(2);

System.out.printf("year: %d\n", in.getYear());
System.out.printf("month: %d\n", in.getMonth());
System.out.printf("day: %d\n", in.getDay());
System.out.printf("weekday: %d\n", in.getWeekday());
// 객체를 가져오거나 값을 설정할때 직접적으로 설정하는 것이 아니라
// getter 와 setter를 설정하여 사용하면 보안성이 강화된다.

다음과 같이 값을 설정할 때에는 set 메서드를, 값을 가져올 때는 get 메서드를 설정하면 숨겨진 변수에 대해서도 값을 넣거나 가져올 수 있게 된다.

생성자(constructor) 메서드

생성자 메서드: 클래스가 객체화될 때 초기화하는 기능을 수행하는 메서드

반환형을 사용하면 생성자가 아니라 일반 메서드가 되어버리기 때문에 int, void같은 리턴값을 설정하지않는다.

public MyTime() {
System.out.println("-----MyTime()-----");
hour = minute = second = 1;
}
  1. 객체가 생성될 때 호출되는 메서드
  2. 형식: 클래스이름();
  3. 반환형이 없다.
  4. 클래스의 초기화 기능을 수행하는 메서드
  5. 생략가능: JVM이 자동생성해서 처리한다.
  6. Method Overload가 가능하다 (메서드 명이 동일하지만 인자정보가 다른 메서드)
    • 인자가 없는 생성자는 default constructor 라고 불리고
    • 다른 인자정보가 있는 생성자는 overload constructor 라고 불린다.
public MyTime() {
System.out.println("-----MyTime()-----");
hour = minute = second = 1;
}

// overload 된 생성자
public MyTime(int h, int m, int s) {
	hour = h;
	minute = m;
	second = s;

}

MyTime mt1 = new MyTime();
	
MyTime mt2 = new MyTime(13, 37, 50);

이렇게 다른 형식으로 불러올 수 있다.

this. 생성자

같은 클래스 내의 생성자를 호출하는 생성자이다.

this(); - 자신의 생성자를 표현

this - 자신의 정보를 담는 참조변수

public MyTime(int h) {
this(); // this 생성자 : MyTime() 을 호출

this 생성자는 무조건 첫번째 명령으로 실행되어야한다.

instance method와 this 메서드의 원리

객체가 만들어질때 생성되는 변수를 instance 변수라고한다.

인스턴스 메서드는 첫번째 객체가 생성될때 생성된다.

객체가 만들어지면 메모리에는 위치정보가 있다.

객체가 만들어질 때 만들어진 위치값이 몇번지인지를 식별하려면 식별자가 위치값을 기억해야 한다. 다른위치에만들어진 위치값은 다른 값을 기억한다. 그러면 객체를 식별할 수 있는 것은 각각의 위치값이다. 주소값을 this 에 넘겨주면 위치값이 전달되고 this 에 heap 메모리에 저장된 내용이 호출된다. 외부에서는 new 객체명으로 불리게 되지만 내부에서는 this.를 이용해 호출한다.

변수의 참조순위 : 가까운 것 부터이기 때문에 바깥쪽의 지역변수명과 멤버필드 이름이 같을 경우에는 this.를 사용하여 호출해야 정확한 인자를 호출할 수 있다.

좋은 웹페이지 즐겨찾기