- 객체지향 프로그래밍
-추상화(Abstraction) : 프로그램이 필요로 하는 실제 데이터들을 모델링하는 기술 (설계중요)
-캡슐화(EnCapsulation) : 객체 지향의 가장 중요한 데이터 보호 기술 (접근제한자)
-상속(Inheritance) : 클래스의 재사용과 소스 코드의 중복 제거를 목적으로 하는 기술
-다형성(Polymorphism) : 상속을 이용하여 여러 클래스 타입을 하나의 클래스 타입으로 다루는 기술
(다양한 타입을 하나의 타입으로)
접근 제한자를 사용하는 이유(Public, Private 등)
|
- 힙영역에 생기는것(new) : 객체화 인스턴스화
메모리영역은 힙, 스택, 데이터로 이루어져있음
- 접근 제한자의 종류
- (+) public : 클래스 안과 밖, 패키지 안과 밖에 있는 모든 클래스들이 접근 가능하다.
- (#) protected : 비 상속시에는 default 와 동일하며, 같은 패키지에 속한 클래스 간에만 멤버의 접근이 가
능하며 다른 패키지에 있는 클래스일 때는 상속관계의 후손클래스 내에서만 부모클래스의 멤버에 접근
이 가능하다.
- (~) default (package private) : 같은 패키지에 속한 클래스 간에만 멤버들에 대한 접근이 가능하다.
- (-) private : 멤버변수의 캡슐화를 위해 사용되는 제한자로 클래스 안에서만 접근이 가능하며 클래스 밖에
서는 접근이 불가능하다.
+, #, ~, -가 있는 이유 UML을 그리기 위해 |
package access.sample;
public class PrivateSample {
private int num; //선언된 클래스 안에서만 접근 가능
public int getNum() { //값 호출을 위한 Getter
return num;
}
public void setNum(int num) {//값 대입을 위한 Setter
this.num = num;
}
}
setNum에 num이 들어오면 멤버필드에 저장
package access.test;
import access.sample.PrivateSample;
public class TestPrivate {
public static void main(String[] args) {
PrivateSample psamp = new PrivateSample();
psamp.num = 10; //private 이므로 접근 제한 에러발생
psamp.setNum(10); //public이므로 접근가능
System.out.println(psamp.getNum()); //public이므로 접근 가능
}
}
5번째줄에서 오류가 나는데 import로 불러와서 나 쓰겠다 하면 오류안남
다른패키지에 있는것은 꼭 임포트해줘야한다
private이면 import해도 못 씀
대신에 아랫줄에 num이라는 것이 에러가 남
이유는 private이라서
num이 접근안되게끔 하려고 private로 막아놈
- 만약 setNum에 10이상이 들어가면 -1이 저장되게끔 하고싶다면?
public void setNum(int num) {//값 대입을 위한 Setter
this.num = num;
if (num > 10) {
this.num = -1;
}
난 이렇게 했다
package access.sample;
public class PrivateSample {
private int num; //선언된 클래스 안에서만 접근 가능
public int getNum() { //값 호출을 위한 Getter
return num;
}
public void setNum(int num) {//값 대입을 위한 Setter
this.num = num;
if (num > 10) {
this.num = -1;
}else {
this.num = num;
}
}
}
쌤은 이렇게 else까지 추가해주셨다
- public private...
메소드에 private붙히면 오류안나는데 클래스는 public을 붙혀야함
안그럼 오류~
- 생성자에 private입력하면 오류날까?
오류안남..! 바뀌긴함
클래스를 만들기위해서는 생성자가 반드시 필요함(+멤버필드, 메소드)
생성자안에 private를 넣으면 내안에만 내것만 만들어진다
언제쓰냐 최대한 나를 숨길때 메인에 하나만 생성할 때
final은 단독!! 수정불가, 상속 못하게끔
따라서 final 과 private은 세트(생성자앞에 private넣었을때)
- 상속
protected : private인데 내 자식이 아니면 건들지마 (접근권한 좀 해제)
private면 자식도 못 갖다씀
child가 parent를 상속함
엄마껀 쓸수있지만 엄마는 자식꺼 못 씀
자식 누군지도 모름
child에는 int라는게 없음 올라가보면 부모에 int num이라는게 있음
거기에 저장
- Default
패키지가 다름
DefaultSample1에 public int num1이라고 해주면 오류안남
코드 초기화는 생성자에서!
중복은 안좋다
기본 생성자는 꼭 넣어주자
public final class 클래스명 : 종단 클래스, 더 이상 상속시킬 수 없는 클래스, 서브(후손) 클래스를 만들 수 없다 public abstract class 클래스명 : 추상(미완성된) 클래스, 상속을 이용해 후손 클래스가 부모의 미완성된 기 능을 완성시킨다
- 메소드를 쓰는 이유는?
1. 높은 재사용성
2. 중복 코드 제거
3. 프로그램 구조화
- 오버로딩: 기존에 없는 새로운 메소드 정의(새거, 상속에 없을 때)
같은 이름으로 메서드를 다양하게 만들 수 있음
장점 : 이름짓기 편하다 out1, out2이렇게 안해도됨
메소드 오버로딩시의 규칙은 메소드 이름은 반드시 같아야 하며, 매개변수의 자료형과 개수는 다르게 구성 되어야 한다.
반환타입은 오버로딩 구현하는데 영향을 미치지 않는다
- 오버라이딩 : 상속 받은 메서드의 내용을 변경하는 것(똑같은 애를 바꾸는거)
반환타입은 영향을 미친다
상속관계가 있을 것이라면 가변 인자는 사용하지 말것 (int ...a)같은거 배열같은거임
- return은 매개변수는 여러개일 수 있으나 리턴값은 하나
- 생성자에는 return타입이 없다
생성자의 이름은 클래스 이름과 같아야한다
생성자는 public으로 하자
(B에 있는 int a 를 int b로 고치기)오타
b가 a상속받았으니까 b는 a껄 쓸 수 있음
extends없고 저렇게 A객체생성해도 똑같은 값나옴
- this ( ) 생성자
생성자 내에서 해당 클래스의 다른 생성자를 호출할 때 사용할 수 있다 사용할 경우에는 반드시 생성자 { } 안의 첫 줄에 기입해야 한다. 생성자의 처리 코드가 중복되었을 때 코드 중복을 제거할 목적으로 사용할 수 있다
생성자는 가장 맨 윗줄에 호출(아래에 쓰면 오류)
기본 생성자 꼭!! 만들어주기
package oop.test;
import oop.sample. Person;
public class TestArray {
public static void main(String[] args) {
Person[] list = new Person[3]; // 3명을 보관할 수 있는 객체배열 선언
list[0]=new Person("김개똥", 19, '남');
list[1]=new Person("김말똥", 20, '남');
list[2]=new Person("김소똥", 22, '여');
Person[] list1 = {new Person("김개똥", 19, '남'),
new Person("김말똥", 20, '남')};
하나하나써줄수도있지만 괄호를 써서 해줄 수도있음
package inherit.bind;
import inherit.sample.Child;
import inherit.sample.Parent;
public class TestBinding {
public static void main(String[] args) {
Parent p = new Child();
p.display( ); // 컴파일시에는 정적 바인딩, 실행시에는 동적 바인딩됨
}
}
- 추상클래스
추상 클래스는 미완성된 클래스를 뜻하며, 선언되어 있지만 구현되지 않은 미완성의 메소드(추상 메소드)를 포 함하고 있는 클래스일 때 반드시 astract 키워드를 class 앞에 붙여 준다. 클래스로서의 객체 생성은 못 하지만 새로운 클래스를 작성할 때 부모 클래스로 이용되며 새 클래스 작성을 위한 템플릿이 되어 상속 받은 클래스들의 규칙을 주는 용도로 사용 가능하다.
인터페이스는 여러명의 양부모가능, 서로 상속도 가능
추성클래스는 찐 하나
'JAVA > Java' 카테고리의 다른 글
20201013_15 버블정렬, 2차원배열, Arraylist (0) | 2020.10.13 |
---|---|
20201012_14 정처기실기 JAVA문제 (0) | 2020.10.12 |
20201008_13 (0) | 2020.10.08 |
20201008_13 메소드오버로딩 (0) | 2020.10.08 |
20201008_13 교과목어쩌구 모범답안 (0) | 2020.10.08 |
댓글