Cute Happy Ghost
본문 바로가기
JAVA/Java

20201012_14 접근제한자, 오버로딩, 오버라이딩

by JENN_tech7 2020. 10. 12.
728x90
SMALL
  • 객체지향 프로그래밍
    -추상화(Abstraction) : 프로그램이 필요로 하는 실제 데이터들을 모델링하는 기술 (설계중요)
    -캡슐화(EnCapsulation) : 객체 지향의 가장 중요한 데이터 보호 기술 (접근제한자)
    -상속(Inheritance) : 클래스의 재사용과 소스 코드의 중복 제거를 목적으로 하는 기술
    -다형성(Polymorphism) : 상속을 이용하여 여러 클래스 타입을 하나의 클래스 타입으로 다루는 기술
    (다양한 타입을 하나의 타입으로)

  접근 제한자를 사용하는 이유(Public, Private 등)

  1. 외부로부터의 데이터를 보호하기 위해서
  2. 외부에는 불필요한 데이터! 내부적으로만 사용되는 부분을 감추기위해서
    ex) 비밀번호, 통장잔고
  3. 메서드 변경한다고 가정했을 때, 이 메서드를 참조하는 영역을 모두 확인해야함

 

 

 

 

  • 힙영역에 생기는것(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 앞에 붙여 준다. 클래스로서의 객체 생성은 못 하지만 새로운 클래스를 작성할 때 부모 클래스로 이용되며 새 클래스 작성을 위한 템플릿이 되어 상속 받은 클래스들의 규칙을 주는 용도로 사용 가능하다.

 

 

 

인터페이스는 여러명의 양부모가능, 서로 상속도 가능

추성클래스는 찐 하나

 

 

 

 

728x90
LIST

'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

댓글