day 9 - 객체지향,클래스
2022-03-14
클래스 - 객체를 만들기 위한 설계도
객체지향을 간단하게 말하면 설계도대로 분업하여 제작하는것이라고 할 수 있다.
객체지향 프로그래밍은 소프트웨어 상에서 분업화를 이루어냄으로써 쉬운 유지보수가 가능해진다.
이런 설계도를 소프트웨어적으로 만들어내는 양식이 바로 클래스이다.
클래스의 요소로는 속성(변수), 동작(메서드) 가 있는데 이는 아까 설명한 설계도와 비슷한 원리이다.
new 로 만들어진 모든 객체는 heap 메모리에 만들어지고 참조변수는 stack 메모리에 만들어진다.
클래스의 특징
- 추상화: 각 객체의 공통속성을 모아서 설계
예를들어 컴퓨터에 속한 모니터, 본체, 키보드, 마우스등을 객체라고 할 수 있고 각각의 객체를 만들어내기 위한 설계도가 있었을 것이다. 속성(상태) 는 변수, 행위(동작)은 메서드라고 할 수 있다. 그리고 그 안의 모든 요소들은 객체라고 할 수 있다.
- 은닉화: 객체가 갖는 중요한 속성을 외부로부터 숨긴다(접근제한자를 이용)
- 상속: 코드의 재사용(기존 객체기능을 돌려받아서 새로운 객체를 생성
- 다형성: 각 객체별로 명령을 전달하는 게 아니라 추상적 단계에서 명령을 전달한다.
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;
}
- 객체가 생성될 때 호출되는 메서드
- 형식: 클래스이름();
- 반환형이 없다.
- 클래스의 초기화 기능을 수행하는 메서드
- 생략가능: JVM이 자동생성해서 처리한다.
- 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.를 사용하여 호출해야 정확한 인자를 호출할 수 있다.
Author And Source
이 문제에 관하여(day 9 - 객체지향,클래스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@semihumanbeing/국비지원-day-9-객체지향클래스저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)