객체 지향 프로그래밍 기술
OOP 기술
은닉 (캡슐화 :Encapsulation), 상속(Inheritance), 다형성(Polymorphism)
상속
- 기존의 클래스를 확장 -> 새로운 클래스를 이끌어내는 것
- is a 관계를 만족
- ex. 돌고래 is a 포유류 != 포유류 is a 돌고래 *
- JAVA : 단일 상속만 지원
- 자식클래스 : 상속 받아 새롭게 만들어진 클래스
- 부모클래스: 멤버변수와 메서드를 물려준 클래스
- 부모클래스의 생성자는 상속 불가
public class 자식클래스 extends 부모클래스 {
//정의사항 기술
}
- 부모 클래스에서 private 접근제한을 갖는 멤버변수와 메서드는 상속 X
- 자바의 모든 클래스는 object 클래스를 상속 받는다. 위 클래스는 자바의 최상위 클래스이다.
public class Human {
// 사람이라면 가져야하는 특성을 기술한다
public String name;
public int age;
}
public calss Salaryman extends Human{
// human의 특성인 name, age는 적지 않아도 자동으로 설정된다
public int salary;
}
public class Student extends Human{
public String major;
}
public class InheritancsExample {
public static void main(String[] args) {
Student st1 = new Student();
st1.name = "김학생";
st1.age = 20;
st1.major = "기계공학";
Salaryman sm1 = new Salaryman();
sm1.name = "나직장";
sm1.age = 40;
sm1.salary = 8000;
}
오버라이딩 vs 오버로딩
오버라이딩
상속 시 부모가 물려준 ㅎ마수가 마음에 들지 않는다면, 같은 이름 같은 파라미터 같은 리턴자료형을 재정의하는 것
오버로딩
같은 이름의 함수를 여럿 정의하는 것
파라미터의 자료형이나 개수는 달라야한다
메서드 재정의 (Overriding)
메서드 재정의
부모클래스에서 상속받은 메서드를 자식클래스에서 행위를 바꾸거나 보완하기 위해 다시 정의해서 사용하는 것
부모클래스에서 사용하던 메서드를 자식클래스에서 다른 용도로 사용할 때에 필요
새롭게 재정의된 메서드가 우선권을 갖는다
* 메서드 재정의 규칙 *
반드시 상속을 전제로 해야한다
- 반드시 반환 유형이 같아야한다
- 메서드 이름이 같아야한다.
- 매개변수선언이 정확히 일치해야 한다
- 접근제한자는 같거나 더 제한이 없어야한다 (최대 public)
public class Human { public String name; public int age;
public void 자기소개하기() {
System.out.println("이름 : " +name);
System.out.println("나이 : " +age)
}
public void 코딩하기() {
System.out.println("일반인은 코딩을 못합니다.");
}
}```java public class Programmer extends Human{ public int repoCount; public String devLang; // 오버라이드는 부모 측 // 메서드와 이름, 파라미터, 리턴 타입이 같게 자식 쪽에서 다시 선언한다 // 오버라이드된 메서드 왼쪽에는 일반 메서드와 달리 삼각형 심볼이 생긴다. // 오버라이드 애너테이션은 붙여도 되고 안 붙여도 된다. @Override public void 자기소개하기() { System.out.println("이름 : " +name); System.out.println("나이 : " +age); System.out.println("레포 갯수 : " +repoCount); System.out.println("개발언어 : " +devLang); } @Override public void 코딩하기() { System.out.println("개발자가 " + devLang + "로 코딩합니다."); } }public class OverrideExample { public static void main(String[] args) { // 프로그래머 클래스의 인스턴스 생성 Programmer p1 = new Programmer(); // 해당 인스턴스에 값 대입 p1.name = "김개발"; p1.age = 30; p1.devLang = "JAVA"; p1.repoCount = 50; // 자기소개와 코딩을 시켜보세요 p1.자기소개하기(); p1.코딩하기(); } }
중복 (Overloading)
JAVA : 메서드나 생성자의 중복 선언 허용
중복 Overloading
메서드 or 생성자 선언 시, 이름은 같지만 매개 변수 유형/개수 를 다르게 선언해 놓는 것중복을 사용하면 하나의 메서드로 매개 변수의 유형에 따라 다른 동작이 실행된다
중복의 조건
1. 이름 동일
2. 접근제한자 or 반환유형 영향 X
3. 매개 변수의 유형, 개수, 순서가 달라야한다
public class Human {
public String name;
public int age;
// 생성자 오버로딩은 생성자를 여러 유형으로 만드는 것
// 파라미터는 () ->void 파라미터
// (String, int)
// 두가지 유형으로 만들게요
public Human() { //void 파라미터, new Human()인 경우 호출된다
name = "입력하지 않았습니다.";
age = 19;
}
public Human(String n, int a) { // String, int 파라미터, new Human("문자" , 정수)인 경우 호출
name = n;
age = a;
}
}
public class OverloadExample {
public static void main(String[] args) {
Human h1 = new Human();
System.out.println("사람의 이름은 " + h1.name);
System.out.println("사람의 나이는 " + h1.age);
Human h2 = new Human("나영", 23);
System.out.println("사람의 이름은 " + h2.name);
System.out.println("사람의 나이는 " + h2.age);
}
}
public class Cat {
public String name;
public String kind;
public Cat() { //void 생성자
name = "이름을 입력하지 않았습니다";
kind = "품종이 확인되지 않았습니다.";
}
public Cat(String n, String k) { //String 생성자
name = n;
kind = k;
System.out.println("지금부터 이 아이의 이름은 " + n + "입니다.");
}
public void Call() {
System.out.println(name + " 이리와");
}
public void Call(String callName) {
System.out.println(callName + " 이리와");
}
}
public class CatMain {
public static void main(String[] args) {
Cat c1 = new Cat();
System.out.println(c1.name);
System.out.println(c1.kind);
c1.Call();
c1.Call("야옹이");
System.out.println("--------------");
Cat c2 = new Cat("오쿠","초코");
System.out.println(c2.name);
System.out.println(c2.kind);
c2.Call();
c2.Call("댕댕아");
}
}
this
this 키워드
자기 자신 객체를 지정할 때 사용하는 키워드
this.: 동일 클래스 내의 멤버(멤버변수, 메서드) 참조this(): 생성자 내부에서 자신의 다른 생성자 호출
=> 당시에 호출되고 있던 객체라고 생각하면 됨
public class Car {
public String model;
public int speed;
public Car(String model) {
this.model = model; //this. 가 붙는다면 멤버변수
this.speed = 0;
}
public void accel() {
if(this.speed + 10 >= 150) {
this.speed = 150; //최대속력 150
} else {
this.speed += 10;
}
}
public void showStatus() {
System.out.println("모델명: " + model);
System.out.println("현재속도: " + speed);
}
}
super
*super 키워드 *
한단계 위 부모클래스의 객체를 지정할 때 사용하는 키워드
super.: 부모클래스의 멤버 참조- `super() : 생성자 내부에서만 사용 가능, 부모클래스의 생성자를 호출할 때 사용
- 생성자의 첫 라인에는 반드시 this(), supuer() 가 있어야하지만, 만일 안 썼다면 묵시적으로 super()가 삽입되는 것이다
- 생성자 내부에서 또다른 생성자를 호출할 때, 반드시 생성자 블록 내부의 첫 라인에 써줘야한다
접근 제한자 (Access Modifier)
접근제한자
멤버변수나 멤버메서드에 접근할 수 있는 영역을 제한하도록 설정하는 키워드
- 즉, 클래스, 멤버변수, 메서드, 생성자의 접근 제어
- main() 메서드가 없는 클래스: 외부 클래스에서 이용할 목적으로 설계된 라이브러리 클래스
-> 라이브러리 클래스 설계 시, 외부 클래스에서 접근할 수 있는 멤버와 접근할 수 없는 멤버로 구분하여 변수, 생성자, 메서드를 설계할 것
접근제한자의 역할 **
**외부에서 객체 생성을 하기 위해 생성자를 호출하지 못하게 하거나 객체의 특정 데이터를 보호하기 위해 해당 멤버변수에 접근하기 못하게 막는 것
- 클래스에는 public과 package friendly만 가능
접근제한자의 종류
- public : 같은 클래스, 같은 패키지, 다른 패키지 전부 접근 가능
- protected : 같은 클래스. 같은 패키지 접근 가능. but, 다른 패키지에 속해있는 클래스의 경우 상속관계가 없으면 접근 불가능
-> 상속 관계이면서 패키지가 다른 경우 super 키워드 사용- package friendly (접근제한자를 붙이지 않는 형태) : 같은 클래스, 같은 패키지에서만 접근 가능.
- * private* : 같은 클래스 내부만 접근 가능
은닉(Encapsulatin) 캡슐화
은닉
사용자에게 상세한 내부 구현을 숨기고 필요한 부분만 보이게 하는 것
클래스의 멤버변수의 접근제한자를 private로 설정
은닉된 멤버 변수에 접근하려면 public 메서드를 통해 접근 가능 -> 변수의 값을 변경시키려면 setter 메서드 이용, 변수의 값을 얻어오려면 getter 메서드 사용
'Programing🤖 > JAVA' 카테고리의 다른 글
| [JAVA] 추상 클래스 (0) | 2024.08.23 |
|---|---|
| [JAVA] 클래스와 객체지향 프로그래밍 (0) | 2024.08.23 |
| [JAVA] 함수와 메서드 (0) | 2024.08.23 |
| [JAVA] 제어 (0) | 2024.08.23 |
| [JAVA] 변수와 자료 (0) | 2024.08.23 |