✨ Object 재정의에 대한 개념을 이해할 수 있다.
✨ 추상클래스와 인터 페이스를 상속 받아 추상 메소드를 구현할 수 있다.
Object class
유저가 만든 객체를 관리하기 위해 만들어진 class 이다.
Object의 method
- equl : 비교를 통해 boolean 값 리턴
- finalize : 객체가 소멸될 때 호출 되기로 한 메서드
garbage collection : 사용하지 데이터를 램에서 제거할 수 있는 작업을 자동화 한 것
inner로 되어있거나, 현재 객체를 소멸못하면 old로 간다.
객체를 소멸하면 eden 영역으로 간다.
- 모든 oop구조의 최상위 클래스
- wait, notify 메서드 : 현재 실행 상태를 나타내는 구조 (*중요)
※ 메모리를 내리는 순서
hide (화면에서 숨겨짐) 메서드 → destroy (부모는 살아있는데 자식은 숨김, java는 없음) →
finalize (현재 내가 가지고 있는 객체가 닫아짐) → close (주소 소멸)
Thread class
메모리를 할당받아 실행 중인 프로그램을 프로세스라고 한다.
프로세스 내의 명령어 블록으로 시작점과 종료점을 가진다.
실행 중에 멈출 수 있으며 동시 수행 가능하다.
어떠한 프로그램 내에서 특히 프로세스 내에서 실행되는 흐름의 단위이다.
즉, 내가 만든 class를 실행하고 싶다. 할 때 사용
thread : 다중, 단일 값을 가지고 있다.
- class를 thread 만들면서 wait, notify를 통해 실행 상태를 확인한다.
- 하나의 프로그램에 여러 thread 가 존재할 수있다.
- web이면 was가 thread 역할을 한다.
All Implemented Interfaces
: Runnable
- thread.runnable : 메인에서 쓰던것을 run에 쓰면된다. run매서드도 확인해보자. (*runnable 을 이용해 상태 확인)
io.package
: class에서 할수 있는 명령을 모아 놓은집합)
stream(입출력 단위가 byte), Reader, Writer
File class
- 오버로드 생성자 : path
- 메서드 : finalize 로 파일 닫는다
BufferedInputStream class
: 글자를 어떤 대상에서 읽어 들이는데 byte단위로 버퍼에 넣어 읽겠다.
- Reads the next byte of data
(Output : 쓰다)
- close : 무조건 close 써야한다, close를 상속하기때문에 finalize가 있다.
- object, 파일객체, db객체 try catch final에 close 무조건 명시한다.
Interfaces (추상화)
: .java로 저장된다 실행단위는 .class 문법은 추상 클래스와 같다.
new 연산자 → 인터페이스 , 추상클래스 사용할 수 없다.
주소 번지는 사용할 수 있다.
public abstract Abstract_aa {
public abstract void test ();
}
Abstract_aa a1 = new My(); // new Abstract_aa() -> new My() : 가능한 case
public static void prn(new new Abstract_aa(){ //재정의의 목적
// 재정의 코드작성
}){} : 위의 문법이 가능하기 떄문에 실행 가능하다.
호출을 해보자.
prn(new My());
※ 특이한 class
math - static, 생성자가 없음(생성자가 private), 후손도 없음 (final)
calendar - 스스로 초기화하는 get인스턴스를 제공했으니 따로 생성자가 필요없다.
Calendar rightNow = Calendar.getInstance();
추상 메소드, 인터페이스의 상속 및 메서드 구현
동적바인딩
: 선조의 주소번지를 통해서 다양한 후손을 메모리에 올려 선택 적으로 사용한다.
ex01) 추상클래스를 상속받아 추상메소드를 구현해보자.
package com.test;
public abstract class Abstract_aa { // 추상class
public abstract void test (); // 추상 메서드
}
package com.test;
public class My extends Abstract_aa{ //Abstract_aa를 상속받는 My class
@Override // 상속받은 후 Override(덮어쓰기) 하자
public void test() {
System.out.println("My test"); // 재정의
}
}
package com.test;
public class Test {
public static void Prn(Abstract_aa a2) { // Abstract_aa a2 = new My(); 랑 같음
a2.test();
}
public static void main(String[] args) { // 실행하는 Test class
// case 1
My m1 = new My(); // My 타입의 m1(변수) 를 생성하자(new My)
m1.test(); // My의 test메소드를 리턴한다.
// case 2
Abstract_aa a1 = new My(); // 선조의 주소번지를 받음
a1.test(); // My는 Abstract_aa를 참조받았기 때문에 부모이름으로 My의 test 메소드를 리턴받을 수 있다.
// upper casting?
//case 3
Prn(new My()); //선조의 주소를 메소드로 받음
// Prn(Abstract_aa a2) = Abstract_aa a2 = new My(); 랑 같기 때문에
// Prn(new My()) 도 리턴 받을 수 있다.
//case 4
Prn(new Abstract_aa() { // 무조건 재정의 해야한다. (추상클래스, 인터페이스는 new연산자를 사용할 수없는데 익명으로 1번 사용할 수 있다)
@Override
public void test() {
System.out.println("나 재정의야!");
}
});}
}
========================================================================
My test
My test
My test
나 재정의야!
ex02) 추상 클래스를 동적 바인딩과 정적 바인딩으로 출력해 보자.
package com.test01;
public abstract class base { // 추상 class base
public abstract void Start(); // 추상 메소드 Start, Stop
public abstract void Stop();
}
package com.test01;
public class Puppy extends base { // base class 참조받는 Puppy class
@Override
public void Start() {
System.out.println("puppy's Start()");
}
@Override
public void Stop() {
System.out.println("puppy 'Stop()");
}
}
==========================================================================
package com.test01;
public class Duck extends base{ // base class 참조받는 Duck class
@Override
public void Start() {
System.out.println("Duck's Start()");
}
@Override
public void Stop() {
System.out.println("Duck 'Stop()");
}
}
=======================================================================
package com.test01;
public class Pig extends base{ // base class 참조받는 Pig class
@Override
public void Start() {
System.out.println("pig's Start()");
}
@Override
public void Stop() {
System.out.println("pig 'Stop()");
}
}
package com.test01;
import java.util.Scanner;
// 동적바인딩
public class MTest {
public static void main(String[] args) {
System.out.println("Input no :");
Scanner sc = new Scanner(System.in);
int no = sc.nextInt();
base b1 = null; // null이란 키워드는 객체를 null로 초기화 해주는 키워드이다.
switch(no){ // 동적바인딩 : 다형성의 목적 1. 코드를 단촐하게한다, 2. 메모리 속도향상 , 3. 메모리 효율적으로 사용
case 1:
b1 = new Duck();
break;
case 2:
b1 = new Puppy();
break;
case 3:
b1 = new Pig();
break;
}
b1.Start(); // 후손이 가지고 있는 Start()와 Stop()을 리턴한다.
b1.Stop();
}
}
// 정적 바인딩
package com.test01;
import java.util.Scanner;
public class MTest2 {
public static void main(String[] args) {
System.out.println("Input no :");
Scanner sc = new Scanner(System.in);
int no = sc.nextInt();
switch(no){ // 정적바인딩
case 1:
Duck d1 = new Duck();
d1.Start();
d1.Stop();
break;
case 2:
Puppy p1 = new Puppy();
p1.Start();
p1.Stop();
break;
case 3:
Pig p2 = new Pig();
p2.Start();
p2.Stop();
break;
}
}
}
==============================================================
Input no :
2
puppy's Start()
puppy 'Stop()
ex03) 인터페이스를 동적 바인딩과 다운캐스팅 , get/set 구조를 확인 해 보자.
package com.test02;
// class interface는 implement 사용해 후손을 참조한다.
public interface base {
void Start();
void Stop();
}
package com.test02;
public class Puppy implements base { // implement로 base를 참조
@Override
public void Start() {
System.out.println("puppy's Start()");
}
@Override
public void Stop() {
System.out.println("puppy 'Stop()");
}
}
======================================================================
package com.test02;
public class Duck implements base{
@Override
public void Start() {
System.out.println("Duck's Start()");
}
@Override
public void Stop() {
System.out.println("Duck 'Stop()");
}
}
====================================================================
package com.test02;
public class Pig implements base{
// 선조의 주소번지를 통해서 재정의가 되지 않은 후손의 메소드를 제어할 경우 확인
private int a; // 멤버변수, private을 주게되면 get/set 만들어야한다.
// (참조받는 객체가 private로 되어있어 보이지 않기 때문에 get,set 으로 값을 전달 및 리턴 해야한다)
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
@Override
public void Start() {
System.out.println("pig's Start()");
}
@Override
public void Stop() {
System.out.println("pig 'Stop()");
}
}
//실행코드
package com.test02;
public class MTest3 {
public static void main(String[] args) {
base b1 = new Pig(); // new Base() <- new Pig() 동적바인딩(선조로 후손을제어), object를 써도된다.
b1.Start();
b1.Stop();
System.out.println("↑ 동적바인딩!");
// down casting , 주소번지에 올라간 것만 사용할 수 있다.
((Pig)b1).setA(100);
System.out.println(((Pig)b1).getA());
System.out.println("↑ 다운캐스팅!");
}
}
===================================================================
pig's Start()
pig 'Stop()
↑ 동적바인딩!
100
↑ 다운캐스팅!
package com.test02;
public class MTest04 {
public void Prn(base b) { // base b = new Pig()
b.Start();
b.Stop();
}
public static void main(String[] args) {
new MTest04().Prn(new Pig());
new MTest04().Prn(new base() { // 추상클래스, 인터페이스는 new생성자 불가, 재정의 해야한다.
@Override
public void Start() {
System.out.println("111111");
}
@Override
public void Stop() {
System.out.println("222222");
}
});
}
}
=========================================================================
pig's Start()
pig 'Stop()
111111
222222
package com.test03;
import java.util.Objects;
public class Car {
private String car_name; // get,set이 필요하다
public Car(String car_name) { // source - field
super();
this.car_name = car_name;
}
public String getCar_name() {
return car_name;
}
public void setCar_name(String car_name) {
this.car_name = car_name;
}
package com.test03;
public class Mtest {
public static void main(String[] args) {
Car c1 = new Car("sm5"); // 생성자 생성 sm5를가지고 super로간다
Car c2 = new Car("sm5"); // sm5를 가지고
System.out.println("주소비교 : " + (c1 == c2)); // c1.toString() == c2.toString()
// 주소비교했더니 다르다
System.out.println("주소비교 : " + (c1.equals(c2))); // c1.toString() == c2.toString()
if(c1.equals(c2)) { // this.객체와 넘어온객체와 비교
System.out.println(" 차이름이 같아 ");
}else {
System.out.println(" 이름이 달라 ");}
}
}
==============================================================
주소비교 : false
주소비교 : true
차이름이 같아
package com.test03;
public class MyTest{
public static void main(String[] args){
System.out.println(args.length);
System.out.println(args[0]);
System.out.println(args[1]);
}
}
==================================================================
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at com.test03.MyTest.main(MyTest.java:7)
위 내용 처럼 입력값이 없을 경우 예외처리 안내문구가 뜬다.
이럴 경우에는 입력을 해줘서 값을 리턴받아야 하는데 prompt 를 이용해 입력 후 리턴 받아보자.
※ prompt 창 이용 방법
: 오른쪽 마우스 클릭 → Run As → Run Configurations → project 와 main 경로 재 확인 →
→ 두번째 탭의 Arguments → Variables(Program Arguments) → String Prompt → Run
Throwable Class (lang.package)
: jvm 프로그램 실행중단 → 내부적으로 가장먼저 생성됨
Direct Known Subclasses (Throwable의 하위클래스)
- Error, Exception : 객체 생성해서 실행시점으로 돌려줌
- 파이썬에서 봤던 메서드를 확인할 수있다.
ex) exception (checked, unchecked)
- 자주 등장하는 exception
: ArithmeticException, IllegalArgumentException, NullPointerException, IndexOutOfBoundsException
Class RuntimeException (실행시에 나타나는 예외처리)
ex) integer -> parseInt 매서드 -> NumberFormatException
C:\Users\hyeri>cd c:\Test03
c:\Test03>dir/w
C 드라이브의 볼륨에는 이름이 없습니다.
볼륨 일련 번호: BE80-C42F
c:\Test03 디렉터리
[.] [..] MyTest.java 새 텍스트 문서.txt
2개 파일 175 바이트
2개 디렉터리 386,606,727,168 바이트 남음
c:\Test03>javac MyTest.java
c:\Test03>java MyTest
0
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at MyTest.main(MyTest.java:5)
c:\Test03>java MyTest abc def
2
abc
def
c:\Test03>javac MyTest.java
c:\Test03>java MyTest
c:\Test03>javac MyTest.java
c:\Test03>java MyTest
0
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at MyTest.main(MyTest.java:5)
c:\Test03>java MyTest abc
1
abc
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at MyTest.main(MyTest.java:6)
c:\Test03>java MyTest abc 1 1 1 1
5
abc
1
c:\Test03>
예외처리(Exception)
package com.test04;
public class MyException extends Exception {
public MyException(String msg) {
super(msg)
; }
}
package com.test04;
public class MyEceptionTest {
public static void main(String[] args) {
int a = 10;
try {
if(a>0) {
throw new MyException("0보다 크잖아");
}
} catch(MyException m) { // MyException m = new MyException("0보다 크잖아");
System.out.println(m.getMessage());
} catch(Exception e) { // 위에 실패하면 선조 Exception 이 잡아라
System.out.println(e.getMessage());
} finally {
System.out.println("예외가 나던지 말던지 반드시 처리해줘 파일클로즈, 디비클로즈, 복원파일등 하자");
}
}
}
=======================================================================
0보다 크잖아
예외가 나던지 말던지 반드시 처리해줘 파일클로즈, 디비클로즈, 복원파일등 하자
package com.test04;
//throws : 예외를 위임, 메소드 뒤에 선언하는 키워드
//throw : 예외를 실행하는 키워드, throw new MyException();
/* try {
} catch(후손 Exception){
} catch(Exception e){
} finally {
}
*/
public class Mtest {
public static void main(String[] args) {
// 메인 실행시 두개의 정수를 받아서 합을 구하자.
int a = 0;
int b = 0;
try {
a = Integer.parseInt(args[0]);
b = Integer.parseInt(args[1]);
}catch(NumberFormatException n) {
System.out.println("예외났음");
}
System.out.println(a+b);
}
}
package com.test04;
public class Mtest02 {
public static void Prn() throws Exception {
throw new Exception("예외야");
}
public static void Prn02() throws Exception {
Prn();
}
public static void Prn03() throws Exception {
Prn02();
}
public static void main(String[] args) {
try {
Prn03();
} catch (Exception e) {
System.out.println(e);
System.out.println(e.getMessage());
}
//main은 try/cach처리해야한다.
}
}
====================================================
java.lang.Exception: 예외야
예외야
package com.test04;
public class Mtest03 {
public static void main(String[] args) {
for(int i =0; i < 20; i++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
} //"Thread.sleep(1000); "전체 시스템 죽였다 살렸다. -> Try /catch 주자 반드시강제로 줘야하는아이
System.out.printf("%3c", '♥');
}
}
}
=============================
♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥
천천히 하트가 한개씩 뜰것이다.
'|Playdata_study > Java' 카테고리의 다른 글
210701_Java (user class, GUI구현) (0) | 2021.07.01 |
---|---|
210630_Java (File class(io.package)) (0) | 2021.07.01 |
210628_Java (package, class) (0) | 2021.06.28 |
210624_Java (캡슐화/상속/추상화) (0) | 2021.06.24 |
210623_Java (배열, class) (0) | 2021.06.23 |
댓글