본문 바로가기
  • 문과생의 백엔드 개발자 성장기
|Playdata_study/Java

210624_Java (캡슐화/상속/추상화)

by 케리's 2021. 6. 24.

class

 

모든 클래스는 object의 후손 상속이고 단일 상속이다.
클래스 객체는 반환형이 없다.
모든클래스는 생성자 제공,
this() super() → 생성자 안 에서만 작성이 가능하다, 무조건 첫 줄에 선언 되어야 한다.

 

 

//↓ public class Test01 extends object{} 랑 같다
public class Test01 {
	private int a;
	private int b;
	
	public Test01() { //1. super() 생성자가 내포되어있다.
		System.out.println("a="+a + "b="+b);
	}
	public Test01(int a, int b) {
		System.out.println("a=" + a + "b="+ b);
	}
    
    
 public static void main(String[] args) {
	//클래스 이름, 클래스 변수 = new 클래스이름():
		Test01 t1 = new Test01();
		System.out.println(t1.toString()); 
		//class : 사용자자료형 → 정보, 주소 등 = object
		
		//System.out.println(new Test01().toString()); //동적메모리?
		Test01 t2 = new Test01(100,200);
		System.out.println(t2.toString());
                // toString()은 주소를 말한다.
        
=================================================================
a=0 b=0
com.test.Test01@15db9742
a=100 b=200
com.test.Test01@6d06d69c

 

 

	public Test01() {
		super(); // 기본생성자를 호출,
		System.out.println("Test01() ");
	} //default 생성자
    
   	public static void main(String[] args) {
			//클래스 이름, 클래스 변수 = new 클래스이름():
		Test01 t1 = new Test01();
		System.out.println(t1.toString());
        
    ============================================================
    
   Test01() 
   com.test.Test01@15db9742
    

 

 

위 코드는 자동 생성이 가능하다.

 : 오른쪽 마우스 클릭 → source → Gcf, Gcuf 등 옵션을 선택하면 된다.

 

 

 

 

 

	// source -> GCS, GCF
	public Test01() {
		super();	
	}

	
	public Test01(int a, int b) {
	super();
	this.a = a;
	this.b = b;
	}


	public static void main(String[] args) {
			//클래스 이름, 클래스 변수 = new 클래스이름():
		Test01 t1 = new Test01();
		System.out.println(t1.toString());
			//class : 사용자자료형 -> 정보, 주소 등 = object
		
		//System.out.println(new Test01().toString()); //동적메모리?
		Test01 t2 = new Test01(100,200);
		System.out.println(t2.toString());
		
	}

}
================================================================

com.test.Test01@15db9742
com.test.Test01@6d06d69c

 

 

getter & setter

 

 

  클래스의 멤버 변수는 은닉화 하고

  은닉된 멤버 변수에서 값 을 전달 및 변경하는 "setter",
  리턴하는 구조 return_type "getter" 를 만들어서 접근에 대한 제어를 구현한다.

 

 

package com.test;


// 클래스의 멤버변수는 은닉화 하고 은닉된 멤버변수에서 값을 전달 및 변경 setter,
// 리턴하는 구조 return_type getter 를 만들어서 접근에 대한 제어를 구현한다.

public class Test02 {

	private int a; // 같은 class 내에서는 호출 가능하다.
	
	// void setter
	public void setA(int a) {
		this.a = a;
	}
	// getter
	public int getA() {
		return a;
	}
	

public static void main(String[] args) {
	Test02 t1 = new Test02();
	System.out.println(t1.a); // 기본값 0 출력
    
	t1.setA(100); // 값 전달 및 변경
	System.out.println(t1.getA()); // 값 리턴 
    
    ==============================================================
    
   0
   100

 

 

자동화 source를 통해 입력 가능하다.

// source -> getter,setter 
	public int getA() {
	return a;
	}

	public void setA(int a) {
	this.a = a;
	}

 

 

@override

 

 

클래스 개념 

 

1. 캡슐화 클래스 구현

   (생성자, setter, getter, 재정의 - @Override= Object (개념이해 ex) toString))
   Object docs에서 _toString 확인 해보자.
   → 참조형 .jar구현 방법


2. 상속

 

3. 다형성

 

package com.test;

import java.util.Random;
// 클래스 개념 
// 1. 캡슐화클래스 구현 (생성자, setter,getter,재정의 - @Override= Object(개념이해 ex,toString))
// Object-docs에서 _toString
//   -> 참조형 .jar구현방법
// 2.상속, 3. 다형성

public class Myclass01 {

	// 오버로드 : 하나의 클래스 안에서 같은 이름의 메서드를 여러개 정의하는 것을 뜻함
	// 오버라이딩 : 정의를 새로해서 값이 리턴되는 값이 같음
	
	@Override //오버라이드 어노테이션, 재정의되어있는것을 체크해준다. 소스시작할때 걸러준다.
			 // 경고, check,
             
	public String toString() {
		return "내꺼야";
	}
	
    
   
	public static void main(String[] args) {
		System.out.println(new Myclass01().toString());
		// 객체에 "." 하면 원하던 원하지 않던 자동으로 호출 
		// 재정의를 하면 재정의한 것이오고, 아니면 object가온다.
		System.out.println(new Myclass01());
		
		Myclass01 t1 = new Myclass01();
		System.out.println(t1);
		System.out.println(t1.toString());
		
		System.out.println(new Integer("100")); // Integer class가 재 정의함
		System.out.println(new Integer("100").toString()); // 위랑 같음
		
		System.out.println(new Random()); // random class라서 안에 값이 있어야 난수발생, 
        								  // 재정의 불가
	}
}
============================================================================

내꺼야
내꺼야
내꺼야
내꺼야
100
100
java.util.Random@6d06d69c

 

 

😎 알고가기 : export 를 이용한 사용자 import 연결하기 

 

1. import 할 파일을 .jar 파일로 export 해야한다.

  : 파일 오른쪽마우스 클릭 → export → Jarfile → 파일 내보낼 파일 확인 및 경로설정 → Finish 

 

 

 

 

2. 전역 패스 또는 빌드 패스를 설정해서  import 할 수 있게 하자.

 

  1) 전역패스 : C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext 

      위 경로에 .jar 파일을 저장한 후  , 아래처럼 JRE System Library 에  저장한 jar 파일 확인 한다.

      새로운 java 파일을 만들어  " import com.mytest. * ; 패키지 이름으로 넣어준 후 실행한다. 

 

 

 

 2) 빌드패스 :  적용할 프로젝트 → 오른쪽 마우스 클릭  → build path → Configuer build path 

                   → Libraries 클릭 → add External jars (경로 바로가져오기) 또는 add Library (user Library) 클릭 → 

                   → 가져올 jar파일 선택 → Finish 

 

 

 

동일하게 위 파일 실행하면 아래와 같이 import 하여 적용 완료

 

package com.test;
import com.mytest.*; // 패키지이름으로 넣어준다

public class MyTest {

	public static void main(String[] args) {
		Calc c1 = new Calc(1,5);
		System.out.println(c1);
	}
}
// 전역패스, 빌드패스 설정하는것
// jar파일을 export해서 생성한 후 아래와 같이 한다.
// 전역패스 : C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext
// 빌드패스 : 프로젝트 -> 빌드패스 -> 컨피규 -> user, addExternal jars

===================================================================

반드시 처리해야할 구문
Calc [a=1, b=5, getHap()=6, getSub()=-4, getMul()=5, getDiv()=5]

 

 

abstract (추상화)

 

package com.test;

public abstract class Test03 {

	private int a;
	protected int a1;
	public int a2;
			int a3; //default
	
			
	public void Prn() {}
	public static void Prn02(){}; // 정적메소드
	
	public abstract void Prn03(); // 추상메소드 
	// 는 선언만할수있고, 추상메소드를 가지고있는 class는 추상클래스가 되야하기 때문에 class를 변경해야한다.
	
	public int Prn04() {
		return 0;
		
	}
	public double Prn05(int a, int b) {
		return 0;
		
	}
	public String Prn06() {
		return null;
		
	}
}

// object aid 를 이용해 클래스 다이어그램으로 구현하자. 
//3칸으로나뉨 : 이름, 필드, 메소드 
// 이탤릭체class - 추상클래스구나 
// c : 메소드 
// 언더라인 : 스태틱
// a : abstract 
// : 뒤에는 리턴메소드 

 

 

자바의 상속

 

1. 자바는 클래스 간의 단일 상속을 원칙으로 한다.


2. this, super 로 후손과 선조의 주소를 참조한다.


3. this(), super()로 후손과 선조의 생성자를 호출 할 수 있다.


4. 생성자는 상속되지 않는다.


5. 접근제한자를 이용해서 선조는 후손에게 호출할 수 있는 접근을 제한 할 수 있고
   abstract(반추상화) 키워드를 이용해서 강제적인 상속과 재정의를 할 수 있다.


6. 클래스 선언부에 final이라고 명시되면 상속할 수 없다.


7. 객체를 후손을 통해서 생성될 때는 선조가 먼저 생성되고 후손이 나중에 생성된다.
   (소멸은 역순으로 자동 소멸이다)

8. 상속은 두 가지로 나뉜다. 

   클래스 간의 상속(단일), Interface(완전추상화를 하기위해 = 메뉴판, 다중)간의 상속이 있다.

   (Interface는 선언된 메소드만 있다.)

 

 


public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable

 

 

😎 정리하고 가기!

 

다중상속 - implements List, RandomAccess, Cloneable, Serializable 

 

클래스간의 상속 : extends
인터페이스간의 상속 : extends
클래스가 인터페이스 implement

상속을 하는 이유 :  기능 추가, 기능 확장(재정의-override) 위해
 - 선조가 가지고 있는기능 (재정의)
 - 선조기능 : 메소드


인터 페이스는(상수 - field와, 추상메소드-바디{ }없고 이름만 있음 기능이 없음) 로 구성됨.

  오버라이드의 다형성이 된다. 재정의 하지않으면 내가 추상메서드가 되고 그렇게 되면 new연산자를 통해 객체를 생성할 수 없다.


오버로드 : 같은 클래스 내에서 기능은 하나인데  메서드의 네임 벨류 때문에 사용, 사용 방법은  데이터 갯수가 다르거나, 타입을 다르게 해서 사용한다. 

생성자는 무조건 존재 (디폴트, 오버르드생성자)
this, super 키워드 사용 할 수있다.


private 매개 변수는 상속안되고 매서드로만 받아 쓸수있다. 

protect 는 본인 클래스에서 상속해서 사용 가능

public 은 오픈해서 사용 가능

 


max = class.max로 호출한다.
nonstatic 메서드는 new 연산자로 메서드를 생성한 후 가져와야 한다.  

long의 경우 long l = new longvalue() 로 불러와야한다. 

추상클래스의 추상메서드를 재정의하려면 모두 다 재정의 해야된다.

(강제 상속, 강제 재정의) 아니면 추상메서드가된다. 

후손은 바로위의 선조만 안다.

자바는 추상메소드가 없어도 추상클래스가 될 수있다. 

 

// AA파일


package com.test01;

//int a+b 를 관리하는 클래스 
public class AA {

	private int a;
	private int b;
	
	public AA() {
		System.out.println("AA 생성자");
	}
	
	// 상속시 후손 클래스는 public처럼 호출할 수 있다.
	// 같은 패키지 내에서만 클래스 변수를 통해서 public처럼 호출할 수 있다.
//	protected int getA() {
//		return a;
//	}
	protected int getA() {
		return a;
	}
	public void setA(int a) {
		this.a = a;
	}

	public int getB() {
		return b;
	}

	public void setB(int b) {
		this.b = b;
	}
	
	public int getHap() {
		return this.a + this.b;
	}

 

 

// BB파일

package com.test01;

// a+b - d
public class BB extends AA{
	
	private int d;
	public BB() {
		System.out.println("BB");
	}
	public int getD() {
		return d;
	}
	public void setD(int d) {
		this.d = d;
	}
	
	public int getResult() {
		return getHap() - getD();
		//return (getA() + getB()) - getD();
		//return getHap() - d;
		//return getA() + getB() - this.d;
		//return this.getA() + this.getB() - this.d;
		//return super.getA() + super.getB() - this.d;
		//return super.getA() + super.getB() - this.getD();
		
		// 안되는것
		//return (a+b) - d
	}
}

 

package com.test01;

public class Test01 {

	
	public static void main(String[] args) {
		BB b1 = new BB();//  b1은 주소를 받는 변수 (AA를 먼저받고, 그후에 BB받음)
		// (AA BB) b1 = new (AA()→BB()) AA생성하고 BB생성하고
		// AA a1 = new BB();
		// AA a1 = new(AA()→BB())
		//BB b2 = new AA(); --> x
		 // 2개짜린데 한개짜리써서
		b1.setA(100);
		b1.setB(100);
		
		System.out.println(b1.getHap());
		System.out.println(b1.getResult());
		System.out.println(b1.getA() + " : " + b1.getB());
	}
}
=============================================================

AA 생성자
BB
200
200
100 : 100

 

 

 

일반 메서드, 추상메서드 구분

 

package com.test04;

public abstract class Test {
	
	public void test(){}; // 일반
	public abstract void test02(); // body가없으면 추상메소드
	

}

 

 

추상메서드

 

 

package com.test04;

//상수, 추상메소드
public interface IMY {

	// 멤버지정
	public static final int a = 100;
	int b = 200; // = public static final int b = 200; 앞과 뒤가 같다.
	
	public abstract void prn();
	void prn02(); // = public abstract void prn02();
}

 

 

package com.test04;

public abstract class MyABS extends Number {
// abstract 는 new 연산자를 사용할 수 없다. 괄호 안의 매개인자로는 받을 수 있다.
	
	public abstract int intValue(int a);

	
	public static void main(String[] args) {
		//new MyABS();
	}

	@Override
	public int intValue() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public long longValue() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public float floatValue() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public double doubleValue() {
		// TODO Auto-generated method stub
		return 0;
	}

}

 

 

package com.test04;

public class Test02 implements IMY {

	@Override
	public void prn() {
		// TODO Auto-generated method stub

	}

	@Override
	public void prn02() {
		// TODO Auto-generated method stub

	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

 

 

 

이클립스 마켓 : object aid 를 설치한다.

new → other → ObjectAid UML Diagram 파일을 만들고 → 아래와 같이 파일을 실행한다.

 

'|Playdata_study > Java' 카테고리의 다른 글

210630_Java (File class(io.package))  (0) 2021.07.01
210629_Java (class, Interfaces)  (0) 2021.06.29
210628_Java (package, class)  (0) 2021.06.28
210623_Java (배열, class)  (0) 2021.06.23
210622_Java (정의, int, float, char, string)  (0) 2021.06.22

댓글