0620 정리
public void Student {
해당부분에서 public 부분을 접근제어자라고 부른다
오늘은 public과 반대되는 개념인 private를 정리하겠습니다!
private
- public과 반대되는 개념
- 외부에서 접근할 수 없음
- 악의적인 접근을 막기위해서
- 실수 접근을 막기위해서
- 해당클래스 내부에서만 이용하여 접근가능
- 외부에서 사용하기 위해선 getter와 setter 메소드를 이용해야함
- private String name; / private int score; 식으로 변수를 제어한다
외부에서 접근할수 없기때문에 아무리 객체화 하여도
해당 변수값은 변경하거나 출력할 수 없음
그래서 "메소드"화 해서 private를 출력, 변경할수있는데
이 메소드를 게터(getter)와 세터(setter)라고 한다
- getter - 출력
- setter - 변경 (값대입)
이클립스에선 도구화 되어있어서 자동으로
게터와 세터를 만들어 줄수 있는데
(Alt + Shift + S)를 이용하여 게터 세터를 설정할 수 있다
하지만, 개인적으로도 만들 수 있어야하기에 외워두도록 하자!
private는 보통 변수에만 사용한다
메소드는 쓰는 것이 목적이기에 private를 사용하지 않는다
1 2 3 4 5 6 7 8 9 10 11 12 13 | String getName() { return this.name; } int getScore() { return this.score; } void setName(String name) { this.name=name; } void setScore(int score) { this.score=score; } | cs |
보통 메소드 이름에 get과 set을 이용하여 나타내주고
getter를 만들때는 인자는 없고, 리턴이 있는것이 일반적이며
setter를 만들때는 인자가 있고, 리턴이 없는것이 일반적이다
메인메소드에서 해당 private변수를 이용하기위해서는
위의 메소드를 호출하여 사용할 수 밖에 없고
직접적으로 값을 변경하려고하면 나오지않는다.
억지로 하려고하면 빨간줄(오류)가 난다
private를 이용하여 접근을 제어할 수있다!
상속
기존의 클래스에 기능을 추가하거나 재정의하여
새로운 클래스를 정의하는 것을 의미합니다
이러한 상속은 캡슐화, 추상화와 더불어
객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나입니다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Shape{ // 모양 클래스 : 부모, 상위클래스 String name; double area; void showInfo() { System.out.println(this.name+" "+this.area); } Shape(){ System.out.println("Shape에서 호출한 기본생성자"); } } class Circle extends Shape{ // 원 클래스 : 자식, 하위클래스 int radius; Circle(){ //super(); System.out.println("Circle에서 호출한 기본생성자"); } } | cs |
모양을 뜻하는 Shape가 부모가되고원을 뜻하는 Circle이 자식클래스가 된것이다
부모에게 상속받았다라고 표현하는것은 자식클래스 옆에
extends +부모클래스를 붙여 "상속"받은 것을 표현한다
부모클래스 특징
- 모든 자식생성자의 기본 틀이 된다
- 호출하여 사용할땐 자식클래스에서
추가한 코드는 사용할 수가 없다
자식클래스의 특징
- 모든 자식생성자에서는 가장먼저 부모의 "기본생성자"를 호출한다.
- super(); - super란 부모를 뜻하고 ( ) 를 붙여 생성자임을 나타낸 것
- 부모에게 기본생성자가 없다면, 모든 자식생성자에서 문제발생!
- 기본생성자가 없는경우에는 부모클래스에있는 다른생성자를
사용하여 나의 부모부분을 완성시키면된다!
ex) (부모)Shape(int a, int b)
ㅡ> 자식생성자에서 super(10, 20); 호출하여 사용
실무에서 부모에 기본생성자를 만들지않았다면
부모를 수정하는것이 아닌 자식생성자에서 위 방법을 사용해야함!
- 기본생성자가 없는경우에는 부모클래스에있는 다른생성자를
- 호출하는 부모생성자는 "생략"되어있을 뿐이다
- super(); - super란 부모를 뜻하고 ( ) 를 붙여 생성자임을 나타낸 것
- 여러개를 상속받을 수는 없다 - 다중상속 불가능
- 호출하여 사용하면 부모의 멤버변수, 메서드를 사용할 수 있다
상속을 이용하여 활용해 보자
활용한 부분
1. 이미 선언된 변수값은 자식생성자에서 생성하지않는다
ㅡ> x, y 변수 선언을 하지않아도 된다!
2. super를 이용한 자식생성자를 만든다
ㅡ> ColorPoint 생성자에서 x, y값을 넣어줘야 했는데
super ( )를 이용하여 코드를 줄일 수 있었다!
3. this ( ) 를 이용하여 불필요한 변수대입을 반복하지 않았다!
ㅡ> 생성자마다 x, y에 대입을 해줘야했지만
불필요한 반복을 줄일 수 있었다!
오버라이딩
부모의 showInfo()
자식의 showInfoColorPoint() 가 있습니다
자식의 객체는 Color를 함께 출력해야하므로
showInfoColorPoint() 해당 메소드를 자주 사용할 것이다
하지만 showInfo()로도
Color를 가지고있다면? showInfoColorPoint() 로 사용되면 좋겠다
그래서 자식은 내입맛에 맞게 같은 메소드이름으로 재정의가 가능한데
"오버라이딩" 이라고 한다
같은 메소드의 이름인 showInfo ( )를 사용하지만
자식 클래스에서 "같은메소드의 이름"으로 안의 내용을 "재정의"하면
해당 클래스에서 생성된 객체의 showInfo ( )는
"재정의"한 메소드로 사용이 가능하다
최상위 클래스 Object
기본적으로 모든 클래스는 extends Object 를 기본적으로 받고있었던 것이다
클래스 Book의 객체 b를 생성했다
System.out.println( b ) ; 한다면 오류가 나와야 정상이다
ㅡ> b라는 객체에는 자료형이 없기때문
하지만 Object에서 사용되는 메소드인 println은
기본적으로 .toString() = 리턴값을 String으로 바꿔주는 메소드
가 생략되있기 때문이다. 즉, 사진과 같이 b라는 객체뒤에
.toString() 생략되어있어서 오류가 없던것이다
Object는 모든 클래스의 부모클래스이다
그렇기에 오버라이딩이 가능한데
.toString을 오버라이딩하여 재정의하게되면
객체 b를 불렀을때 생략된 .toString()메소드에 반응하여
오버라이딩하여 재정의된 메소드가 나오게된다!
.toString은 실무에서 여태 사용한 showInfo() 메소드처럼 사용한다
그렇기에 showInfo()를 만드는 시간, 코드절약이 가능하다!
'자바(JAVA)' 카테고리의 다른 글
(11) 클래스의 다형성, 추상클래스 (0) | 2022.06.22 |
---|---|
(10) toString, equals의 오버라이딩 (0) | 2022.06.21 |
(8) 퀵정렬 (0) | 2022.06.19 |
(7) 클래스 (0) | 2022.06.15 |
(6)메소드, 재귀함수 (0) | 2022.06.14 |