반응형

**패키지 이름이나 클래스 이름을 변경하고자 할 때

=>직접 클릭해서 변경하는 것은 권장하지 않습니다.

=>IDE에는 대부분 리팩토링 기능을 제공하는데 리팩토링 기능을 이용해서 변경을 하면 동일한 이름으로 만들어진 모든 것을 전부 변경해줍니다.

 

Eclipse에서는 변경하고자 하는 패키지 이름이나 클래스 이름을 선택하고 마우스 오른쪽 클릭하고

[Refactor] -[Rename]을 선택하고 변경하고자 하는 이름을 입력

 

 

**absstract(추상)

1)추상메소드

=>내용이 없는 메소드

=>다형성 구현을 위해서 하위 클래스에 오버라이딩 구현을 위해서 만든 메소드

=>Startcraft라는 클래스의 attack이라는 메소드는 없어도 실행상에는 아무런 문제가 없었지만 상위 클래스 자료형으로 만들어진 변수에 하위 클래스 자료형의 인스턴스를 대입하는 경우 변수는 상위 클래스 자료형의 요소만 사용이 가능하기 때문에  하위 클래스에 있는 attack을 호출을 못합니다.

attack을 호출할 수 있도록 Starcraft클래스에 attack을 만들어 준 것입닏.

Starcraftattack메소드는 직접 호출하기 위해서 만든 것이 하위 클래스의 메소드를 호출할 수 있도록 하기 위해서 만든 메소드입니다.

이런 메소드는 내용을 가질 필요가 없습니다.

=>매소드의 자료형 앞에 abstract를 추가하면 추상 메소드가 되고 이 메소드는 내용이 없습니다.

public abstract 결과형 메소드이름();

:

 

 

 

 

 

=>추상 메소드는 상속받은 곳에서 반드시 구형을 해야 합니다.

Overriding을 해우저야 합니다.

 

=>자바에서는 추상 메소드는 반드시 추상 클래스나 인터페이스에 존재해야 합니다.

 

 

2)추상 클래스

=>인스턴스를 만들 수 없는 클래스

=>Startcraft라는 클래스는 실제 게임을 위해서 만든클래스가 아니고 다형성 구현을 위해 만든 크래스이기 때문에 직접 사용할 필요가 없는 클래스

이 클래스는 인스턴스를 만들 필요가 없는 클래스 입니다.

이런 클래스는 개발자가 실수로 인스턴스 만드는 것을 방지해주는 것이 좋습니다.

인스턴스를 만들지 못하도록 할 때는 class 라는 예약어 앞에 abstract가 추가해주면 추상 클래스가 됩니다.

=>이 클래스는 상속을 통해서만 사용할 수 있게 됩니다.

 

 

 

 

//abstract를 붙이면 추상클래스가 되면 이 클래스의 생성자를 호출하면 에러

public abstract class Starcraft {

          

           //하위 클래스의 인스턴스가 attack을 호출할 수 있도록 오버라이딩을 위한 메소드

           //abstract가 붙이면 추상 메소드가 됩니다.

           //이 메소드는 내용이 없습니다.

           //이 메소드를 소유한 클래스나 인터페이스를 상속하거나 구현한 클래스 에스는 반드시 이 메소드를

           //재정을 해주어야 합니다.

           public abstract void attack() ;

}

 

 

 

**final

1. 변수 앞에 final을 붙이면 이 변수는 읽기 전용이 됩니다.

=>어떤 작업을 할 때 변수의 내용을 변경하지 않는다면 굳이 일반 변수를 사용하지 말고  final을 사용하는 것이 안정성 측면에서 뛰어남

 

2. 메소드 앞에 final을 붙이면 이 메소드는 오버라이딩 할 수 없습니다.

=>오버라이딩:메소드를 다시 정의 하는 것, 기능확장 또는 기능변경할 수 있다.

=>이 메소드가 시스템을 핸들링하거나 이름이 중요한 메소드 인 경우

 

3. 클래스 앞에 final을 붙이면 이 클래스는 상속할 수 없습니다.

=>상속을 못한다는 것은 기능 확장이나 변경을 못하게 하는 것입니다.

=>시스템 관련된 클래스이거나 다른 클래스들과 연관관계가 높은 클래스라서 상속을 못하게 합니다.

 

예전에는 프로그램개발시

자료형 ,변수 를 배울 때

R의 내용을 잊어버리는게 좋다. r에서 배열은 1차원 배열

 

 

 

 

최근 자료형,변수 이름으로 선언

var ->변수

let ->상수 (read only)

위의 기능을 잘 구분해야 한다.

 

읽기전용 - 동시에 사용해도 문제 없음

수정가능 - 동시에 사용하면 문제 가능성이 있음

 

카카오톡에서는 동시에 로그인은 문제가 아니라 동시에 글 쓰기가 문제이다.

카카오톡 2개 로그인해서 동시에 2개 보낼 경우

동시에 수정하는 것은 문제가 생긴다. 아이디가 같을 경우 같은 화면인데 숫자가 안 같게 나올 수 있다.

그래서 같이 쓸수 없는 것과 같이 쓸 수 있는 것을 구분해서 하는 것이 좋다.

JAVA까지는 FINAL이 붙였는지 안 붙였는지 개발자가 판단해야 한다.

C++은 예약어가 거의 없다. 추상인지 아닌지는 개발자가 알아서 해야 한다.

 

Mfcwindows를 핸들링할 수 있기 때문에 bluescreen이 뜬다.

c#등 하라는 것 추천하는 것은 .net등을 사용해서 windows를 핸들링 못하게 한다.

 

 

 

 

 

 

 

위의 경우 삽입인데 수정으로 하여 직관적이지 않을 경우가 있어서 수정을 못하게 한다.

 

상속을 적절히 잘 만들어야 한다.

java는 점점 더 무거울 수 있는데

java의 장점이 하나있다.

java      A class                      

 

A classx라는 메소드를 사용해도 1.3에 돌아갈 수 있다.

 

 

java      A class                      

             AEx class(A 상속햇)

1.2Aclass1.3에서도 돌아갈 수 있다. 바꾼 것이 없기 때문이다.

 

java      A class                       

 

             AEx class(A 상속햇)

           AExEx class

A class가 문제 가 있을 경우 deprecated 하면된다.

원본 그대로 두고 상속받을 class를 만들고 하면 된다.

 

mfc는 사용하면 큰 문제가 생길 수 있다.

win95   A class

           win95에 있는 A class win98에서 지원이 안된다.

win98를 만들면 A class 를 수정한다.

옛날에 만든 것은 돌아가지 않는다.

windowsupdate가 없다 .포맷하고 한다.

맥은 업데이트가 가능하다. 예전에것 돌아간다. 맥은 포맷을 잘 안한다.

 

dll ->프로그램 공유 다른 프로그램에서 사용할 수도 있어니 삭제 하는 것인가 >=>이것은 종속 관계이다.

 

**Interface

=>추상 메소드와 final상수 그리고 default method 만을 소유한 개체

=>인터페이스에 만들어져 있는 메소드는 거의 추상 메소드이기 때문에 인터페이스를 구현한 클래스에서는 메소드를 반드시 재정의를 해야 합니다.

1.클래스에 인터페이스 구현

class 클래스이름 extends 상위 클래스이름 implements 인터페이스이름 나열{

}

 

2.인터페이스는 여러 개 구현할 수 있습니다.

클래스는 반드시 1개만 상속할 수  있습니다.

인터페이스에 있는 것은 추상메소드입니다.

반드시 재정의를 해줘야 합니다.

인터페이스를 구현하면 인터페이스에 있는 메소드가 반드시 존재한다고 보장할 수 있습니다.

인터페이스 이름 대신에 프로토콜(규칙, 규약, 약속)이라고도 합니다.

인터페이스는 GUI 이벤트 처리에 많이 이용합니다.

 

 

3.인터페이스 생성

interface 인터페이스이름{

           상수 선언

           메소드 선언

}

=>상수는 final을 붙이지 않아도 상수화 됩니다.

int N = 10; =>final int N = 10; 으로 해석

 

=>메소드는 abstract를 붙이지 않아도 추상 메소드가 됩니다.

public void attack(); =>public abstract void attack();

 

=>이름을 만들 때는 able이나 listener라는 단어를 뒤에 붙이는 경우가 많은데 listener는 이벤트 처리를 위한 인터페이스인 경우 붙입니다.

 

4.인터페이스 생성과 사용

1)인터페이스를 생성하고 변수 1개와 메소드 1개를 선언

public interface ISample {

          

           //final 이 없어도 final : 변경 못함

           public String TODAY = "2021-01-10";

          

           //abstract가 없어도 abstract

           //내용을 만들면 안되고 ISample implements 한 곳에서는 반드시 Overriding(재정의)을 해야 합니다.

           public void disp();

 

}

 

2)앞에서 만든 인터페이스를 implements하는 클래스를 생성

=>하나의 인터페이스를 implements하는 클래스의 경우 이름을 인터페이스이름Impl로 많이 정하고

클래스를 상속받는 경우는 클래스이름Ex 로 많이 합니다.

 

//ISample이라는 인터페이스를 구혀한 클래스

public class ISampleImpl implements ISample {

 

           @Override

           public void disp() {

                       //인터페이스에 있는 변수를 가지고 와서 출력

                       System.out.println(TODAY);

                       //수정은 안됨 - 인터페이스의 변수는 무조건 상수

                       TODAY = "2021-01-11";

           }

 

}

//ISample이라는 인터페이스를 구혀한 클래스

public class ISampleImpl implements ISample {

 

           @Override

           public void disp() {

                       //인터페이스에 있는 변수를 가지고 와서 출력

                       System.out.println(TODAY);

                       //수정은 안됨 - 인터페이스의 변수는 무조건 상수

                       //TODAY = "2021-01-11";

           }

 

}

 

3)MAIN메소드를 소유한 실행 클래스를 만들어서 disp()를 호출

public class Main {

 

           public static void main(String[] args) {

                       //ISampleImpl 클래스에 있는 disp라는 메소드를 호출

                       //s자 있는지 먼저 확인한다.

                       ISampleImpl iSampleImpl = new ISampleImpl();

                       iSampleImpl.disp();

                      

           }

 

}

 

5.인터페이스는 생성자가 없기 때문에 인스턴스 생성을 할 수 없습니다.

new 인터페이스이름()을 하는 것은 에러

 

6.인터페이스를 자료형으로 해서 변수는 선언할 수 있습니다.

변수를 만들면 인터페이스를 implements한 클래스의 인스턴스의 참조를 대입할 수 있습니다.

ISampleImpl iSampleImpl = new ISampleImpl();

=>위의 문장을 아래처럼 변경해도 됩니다

ISample iSampleImpl = new ISampleImpl();

 

 

7.default method

=>인터페이스에는 내용이 있는 메소드를 만들 수 없지만 예외적으로 default method는 내용을 가질 수 있습니다.

=>추상 메소드가 아니라서 메소드를 오버라이딩 할 필요가 없습니다.

=>접근 지정자를 defualt로 설정해야만 합니다.

 

           //인터페이스에서 내용을 갖는 메소드를 만들고자 할 때는 접근지정자로  default를 사용해야 합니다.

           default void print() {

                      

           }

 

 

8.인터페이스는 여러개 구현이 가능

 

9.인터페이스끼리 상속 가능

interface 인터페이스이름 extends 다른 인터페이스이름{

}

 

====>7,8,9는 빼셔도 됩니다.

 

10.인터페이스 활용

=>템플릿 메소드 패턴을 구현할 때 많이 사용

=>메소드의 모양은 인터페이스에 만들어 두고 실제 구현은 인터페이스를  implements 한 클래스에 하는 것

=>C언어에서는 메소드의 원현은 header파일에 하고 구현을 c파일에서 하는 것도 템플릿 메소드 패턴이고 하나의 파일에서 메소드의 원형은 상단에 만들고 실제 내용은 하단에 구현하는 형태도 템플릿 메소드 패턴

=>고객과 대화하는 분석가 나 설계를 담당하는 설계자 또는 고객은 메소드의 구현 내용은 의미가 없지만 고객의 요청이 제대로 구현되어 있는지는 중요합니다.

고객이나 분석가 또는 설계를 담당하는 사람과 개발자가 대화할 때는 인터페이스를 이용합니다.

고객의 요청 1개마다 메소드는 1개씩 만 만들어져야 합니다.

 

고객:

HELLO JAVA를 출력할 수 있도록 요청시:

 

 

 

 

 

개발자가 이렇게 하면 안된다.고객은 이런 것 알 필요없다.

 

 

 

이름을 잘 못 만들어도 연결하는 것만 잘 하면 된다.

 

메뉴판에서 사진은 return이다.

 

(int x, String y) 매개변수 의 순서를 고려해야 한다.

select from 2개 이상일 경우에는 sort로 해야 한다. 데이터베이스는 행과 열의 순서가 없다.

그래서 2개가 넘어가면 순서를 생각해야 한다.

그래서2개 가 있으면  (int x, String y)가 아닌

class T{

           int x

           String y;

}

T.x T.y이런식으로 하는게 좋다.

여러개가 있을 경우 순서 등 고려해야 하고 문제가 생길 수 있어니깐 하나로 해야 한다.

 

 

 

 

 

 

 

 

**Inner Class

1.클래스 사이의 관계

1). is a: 상속관계

2). has a:포함관계

=>하나의 클래스가 다른 크래스 안에서 사용되는 경우

 

2.InnerClass(내포 클래스)

=>클래스 안에 존재하는 클래스

=>일반 inner class, static inner class, local inner class , anonymous class 4가지

 

 

3.일반 inner class

=>class안에 만들어지는 클래스

=>내부 클래스를 외부 클래스에서만 사용하기 위해서 생성

=>안드로이드의 이번트 처리 인터페이스 들이 내부 인터페이스 형태로 많이 만들어져 있습니다.

=>클래스 안에 클래스를 만들었기 때문에 소스 파일은 1개이지만 컴파일을 해서 클래스를 만들 때는 내부 클래스도 별도의 클래스로 만들어집니다.

외부클래스이름$내부클래스이름.class 형태로 만들어집니다.

=>외부 클래스는 접근 지정자가 default public만 가능하지만 내부 클래스는 private protected도 가능

 

4.static inner class

=>inner class static멤버가 있으면 에러가 발생합니다.

=>이런 경우에는 inner class를 만들 때 stack을 붙여주면 에러가 없어지게 됩니다.

=>static은 인스턴스를 만들기 전에 생성이 되어야 하는데  inner class는 다른 클래스 내부에 있기 떄문에 코드로만 존재하다가 처음 인스턴스를 만들 때 메모리 할당을 받기 때문에 static 멤버 생성이 안됩니다.

class앞에 static을 붙여서 이 클래스 자체를 메모리에 바로 할당하도록 해주어야 합니다.

 

 

5.local inner class

=>local(지역) :메소드 내부에서 생성

=>메소드 내에서 클래스를 만들어서 메소드 내부에서만 사용할 수 있도록 한 클래스

지역에 무엇인가를 만들면 지역이 실행될 때 만들어지고 지역이 종료가 되면 자동 소멸

 

 

6은 좀 어렵다.

6.Anonymous Class(익명 객체)

=>이름 없는 클래스를 가지고 인스턴스를 만들어서 사용

=>클래스에 이름이 있으면 static(method) 영역에 메모리 할당이 되서 사용이 종료되더라도 프로그램이 종료될때 까지 메모리에 계속 남아있게 됩니다.

=>이름 없는 형태로 만들어서 필요할 때만 메모리 할당을 해서 사용하고 사용이 종료되면 소멸시키기 위해서 사용합니다.

메모리가 부족한 모바일이나 임베디드 프로그래밍에서 많이 사용

안드로이드의 이벤트 처리를 이 방법을 이용해서 많이 구현했고 최근의 andriod studio에서는 이 문법을 사용하면 코드 최적화를 통해서 람다식(자바의 함수형 프로그래밍)으로 변환됩니다.

람다는 프로그래밍 언엄다 의미가 다름(파이썬에서는 한 줄 짜리 이름 없는 함수)

 

 

class A{

           메소드;

}

=>A클래스를 상속받아서 메소드를 재정의 한후 메소드를 호출

 

class B extends A{

           메소드 재정의

}

 

B  ob =  new B();//인스턴스

ob.메소드();

//(new B()).메소드();로 작성해도 됩니다.

 

 

 

=>anonymous클래스를 이용하는 방법

new A(){

            메소드 재정의

}.메소드();

 

=>새로운 클래스를 만들지 않았으므로 static영역에 적재되지 않아서 메모리 효율이 위보다 좋아집니다.

 

7.실습

1)메소드 1개를 갖는 인터페이스를 생성

=>Anonymous인터페이스

 

2) Anonymous 인터페이스를 구현한 클래스를 만들고  disp를 재정의

=>AnonymousImpl

           @Override

           public void disp() {

                       System.out.println("일반적인 방법의 상속과 구현");

 

           }

 

3)main메소드에 위의 메소드를 호출하는 구문을 작성

           public static void main(String[] args) {

                       /*

                       //인스턴스의 참조를 obj에 저장했으므로 인스턴스 재사용 가능

                       Anonymous obj = new AnonymousImpl();

                       obj.disp();

                       */

                      

                       //어차피 한번밖에 안해서도 되기 때문에

                       //인스턴스의 참조를 저장하지 않았으므로 인스턴스 재사용 불가능

                       new AnonymousImpl().disp();

                      

                       //클래스를 만들지 않고  Anonymous인터페이스 사용하기

                       new Anonymous() {

 

                                  @Override

                                  public void disp() {

                                              System.out.println("익명 객체를 이용한 인터페이스 사용");

                                  }

                                 

                       }.disp();

           }

 

*사이트 주소:

API

 

1.7 API: http://docs.oracle.com/javase/7/docs/api/

 

1.8 API: http://docs.oracle.com/javase/8/docs/api/

 

 

 

예제 코드

 

http://www.java2s.com/Code/JavaAPI/CatalogJavaAPI.htm

 

http://www.java2s.com/Tutorial/Java/CatalogJava.htm

 

 

 

 

 

**document구성

=>api 디렉토리 안에 있는 index.html이 도큐먼트 시작

=>왼쪽에 2개의 창이 있고 오른쪽에 1개의 창

왼쪽 위의 창은 패키지를 출력

 

왼쪽 아래 창은 패키지 안에 속한 인터페이스와 클래스로 구성

 

오른쪽 창은 선택한 인터페이스 또는 클래스의 구조와 설명 및 사용 가능한 멤버를 출력

 java를 할수 있는 것이 나온다.

 

1.class

=>abstract class: 인스턴스 생성을 할 수 없다.

new 다음에 사용할 수 없습니다.

상속을 통해서만 사용

 

=>final class:상속할 수 없다.

extends 뒤에 나올 수 없습니다.

 

=>extends 뒤에 나오는 이름은 상위 클래스

 

=>implements 뒤에 나오는 이름은 인터페이스

 

public class Date extends Date=>상속 맏은 것

 

=>Direct Known Subclasses:현재 클래스를 상속받은 클래스들

 

2.class설명 뒤에 나오는 항목 중 Field Summary

=>static final 변수(상수): 이 클래스에 메소드들에서 사용하는 옵션

=>클래스이름.상수이름을 사용하면 됩니다.

 

많이사용하게 되는 언어인데 java.lang.thread

field summary 는 수정하면 안된다.

 

3.classs설명 뒤에 나오는 항목 중 Constructor(생성자)

=>인스턴스를 만들기 위한 특별한 용도의 메소드: new 생성자(매개변수)의 형식으로 호출

=>생성자가 없는 경우

1). interfaceabstract class가 아닌지 확인: interfaceabstractinstance 생성을 못하므로 생성자가 없습니다.

메소드로 직접간다.

2).모든 메소드가 static(클래스 이름으로 호출이 가능해서 인스턴스 만들 필요 없다.)이라서 인스턴스 생성이 필요없기 때문

java.lang.System , java.lang.Math 클래스 등

public final class System

extends Object

#final이여서 상속할 수 없다.

직접 메소드로 간다.

전부 static붙어서 인스턴스 생성할 필요없다.

 

 

3)생성자가 없는데 모든 메소드가 static이 아닌 경우

생성자가 없으면 instance를 만들 수 없는데 메소드가 static이 아니다.

=>디자인 패턴(사용하는 용도에 따라 클래스를 다르게 디자인 하는 것)을 적용해서 인스턴스를 별도의 방법으로 만들도록 한 클래스

디자인 패턴 - 개발 할 때는 중요하게 평가 받는다.

 

 

Singleton이나 아닌가 는 것은 메소드를 쭉 한번 봐야 한다.

=>Singleton Pattern:인스턴스를 1개만 만들게 하는 디자인 패턴

                          클래스 안에서 메소드들을 찾아보면 자기 자신의 자료형을 리턴하는 static메소드가 있어서 이 메소드를 이용해서 인스턴스를 생성

                       java.lang.Runtime클래스가 대표적인데 이 클래스에는

                       static Runtime getRuntime()메소드가 있ㄷ어서 이 메소드를 통해서 인스턴스를 생성합니다ㅏ.

Runtime runtime = Runtime.getRuntime();

 

=>Factory Method Pattern:인스턴스를 다른 클래스의 메소드를 이용해서 생성하는 패턴

                                  자신의 클래스이름 뒤에 FacotyBuilder라는 이름이 추가된 클래스가 있으면 이 클래스는 Factory Builder를 이용해서 인스턴스를 생성

 

생성자가 없으면 잘 보고 확인하고 적절하게 사용해야 한다.

 

 

4.Method Summary

=>호출 가능한 메소드 목록이 출력

=>메소드를 볼 때는 오른쪽의 리턴 타입 부분에서 static이 있는지 없는지 확인

static이 있으면 인스턴스 생성없이 클래스이름으로 바로 호출이 가능하고 static이 없는 메소드는 인스턴스를 생성해서 인스턴스.메소드이름 의 형태로 호출

 

=>메소드의 매개변수를 확인 :메소드를 호출할 때 넘겨주어야 하는 데이터

 

=>메소드의 리턴 타입을 확인 :결과를 저장해서 다시 사용할 수 있는지 확인

void이면 결고를 다른 곳에 재사용 할 수 없기 때문에 호출하는 것으로 끝

그 이외의 자료형으로 나와있으면 그 데이터를 변수에 저장해서 다른 곳에 이용할 수 있습니다.

 

 

=>메소드를 클릭해서 메소드의 상세내용보기를 한 후 예외처리를 해야하는지 확인해봐야 하는데 이클립스에서는 예외 처리를 해야 하는 메소드를 호출할 때 예외처리를 하지 않으면 에러가 발생 에러가 발생하면 예외처리 구문으로 묶어도 됩니다.

 

5.Method Summary 출력 가장 하단에 박스에 있는 메소드 이름 들

=>상속받은 그대로 사용하는 메소드들의 이름입니다.

=>이 메소드들의 자세한 설명은 상위 클래스에서 확이해야 합니다.

boolean => true , false주면 된다.

voidreturn이 없다.

 

python에서

start = 0 시작

__add__ =>+를 연산자 오버로딩해야 한다.

 

valuereturn

값이 없거나 None이면 void라는 것이다.

문자 와 숫자는 오류난다.

 

https://matplotlib.org/

https://seaborn.pydata.org/

https://scikit-learn.org/

 

 

6.java.lang.System.클래스에 있는 exit라는 메소드를 이용하면 프로그램을 종료할 수 있습니다.

System.exit(0);

 

7.java.lang.Math클래스에 있는 round라는 메소드를 이용하면 반올림을 할 수 있습니다.

long l = Math.round(5.4)

 

 

8.java.lang.String클래스에 있는 chatAt이라는 메소드를 이용하면 문자열에서 특정 위치에 있는 문자를 추출할 수 있습니다.

이 메소드를 이용해서 "Hello Java"의 세번째 글자를 출력

 

String str = new String("Hello Java");

char ch = str.charAt(2); =>l

 

**예외처리

1.에러

1)물리적 오류(컴파일 오류):문법적으로 맞지 않는 문장을 만들어서 컴파일이나 실행이 되지 않는 현상

=>이클립스에서는 빨간색 에러를 표시해줍니다.

=>반드시 수정을 해서 실행을 시켜야 합니다.

 

 

2)논리적 오류:문법적으로는 잘못 된 것이 없어서 실행이 되는데 실행 결과가 이상하게 나오는 현상

=>에러가 아니기 때문에 코드 상에는 찾기가 어렵고 메모리 값을 확인하기 위한 디버깅을 수행해서 오류를 수정

 

 

3)예외(Exception):문법적으로는 오류가 없어서 실행은 되지만 실행 중 특수한 상황이 발생하면 에러가 발생하는 현상

=>예외처리를 이용해서 잘못된 부분이 있으면 수저을 하고 그렇지 않으면 예외를 기록해서 프로그램을 종료하게 하거나 정상적으로 동장하도록 해주어야 합니다.

 

4)단언(Assertion):물리적 오류도 아니고 예외도 아닌데 개발자가 특수한 조건을 설정해서 조건에 맞지 않는 경우 강제로 예외를 발생시켜 프로그램을 중단시키는 것

=>운영체제 버전이 맞지 않으면 실행을 못하게 하거나 특정 포트가 사용 중이면 실행을 못하게 하는 것

정상적인 상황인데 실행을 못하게 한다. 예를 들면 신한은행에서 iphone탈옥하는 것 사용 못하게한다.

 

 

2.Eclipse에서 디버그 모드로 실행

=>디버그 모드: 메모리에 저장된 값을 확인하기 위해서 실행하는 모드

break point 사용 가능

=>break point 프로그램이 실행하다가 중단할 수 있는 중단점

부분적으로 실행 가능 하는 것이 break point

break point를 만들 때는 라인 번호 옆에 있는 거터를 선택하고 마우스 오른쪽을 클릭해서 Tooggle Break point메뉴를 클릭하면 됩니다.

=>run메뉴의 debug를 실행하면 디버그 모드로 실행됩니다.

 

=>결과가 이상하게 나오거나 실행중 오류가 발생해서 중단되면 중단점을 만들어서 디버그 모드로 실행해서 확인

위처럼 하기 싫으면 코드 중간 중간에 System.out.print를 이용해서 로그를 출력해서 확인하는 방법도 있다.

로그를 출력하는 것은 에러를 수정하고 나면 필요 없는 문장이 되는데 삭제를 하지 않으면 시스템 자원을 소모하게 됩니다.

클라이언트 프로그램은 부담을 적게 줄수 있지만 서버 프로그램은 불필요한 로그를 찍는 것이 시스템 자원을 많이 소모할 수 있습니다.

 

3.예외처리의 목적

1)예외가 발생하더라도 프로그램을 중단하지 않고 계속 실행하기 위해서

2)예외의 내용을 기록해서 예외를 수정하거나 학습용으로 사용하기 위해서

public class Main1 {

           public static void main(String[] args) {

                       int [] ar = {100,200};

                       System.out.println("예외처리의 목적");

                       try {

                                  System.out.println(ar[2]);

                       }catch(Exception e){

                                  System.err.println(e.getMessage());

                       }

                       System.out.println("예외처리의 목적중 하나는 예외가 발생하더라도 계속 작업을 수행하기 위해서입니다.");

                      

           }

}

=>예외가 발생했지만 맨 아래에 출력 구문을 수행

예외처리를 하게되면 예외가 발생하더라도 이후 구문을 전부 수행합니다.

 

 

 

 

 

 

 

 

4.자바의 에러처리

=>자바는 모든 예외를 객체로 처리

=>자바에서 예외 처리의 최상위 인터페이스는 java.lang.Throwable

다시 Error( .심각한 예외)Exception(덜 심각한 예외)으로 처리

=>Exception은 다시 RuntimeException과 일반적인 Exception으로 분류

RuntimeException은 실행 중 jvm에 의해서 발생하는 예외로 개발자가 처리 하지 않아도 되는 예외이고 일반적인  Exception은 컴파일러가 컴파일할 때 확인하는 Exception으로 개발자가 반드시 처리를 해주어야 합니다.

대다수의 언어는 모든 예외를 개발자가 처리해도 되고 처리하지 않아도 문법적으로 오류가 없는데 자바는 일반적인  Exception의 겨우는 반드시 예외처리를 해야 합니다.

 

 

5.자주 발생하는 예외

1)NullPointerException:null인 참조형 변수가 자신의 멤버를 호출하는 경웨 발생하는 예외

a.b이 경우 발생하면 anull이어서 발생

for(임시변수 in 컬렉션) 이 경우에는 컬렉션이 null이어서 발생

a[b] 이 경우 발생하면 anull이어서 발생

 

2)NuberFormatException:숫자가 아니어서 발생하는 예외

=>GU프로그램이나 웹 프로그램에서는 숫자를 직접 입력받을 수 없습니다.

문자열을 입력받은 후 숫자로 변환을 해서 사용합니다.

숫자로 변환할려고 할 때 숫자로 변경할 수 없는 데이터라서 발생하는 예외

 

3)ClassCastException: 강제 형변환이 안되는 데이터를 강제로 형변환 할려고 해서 발생하는 예외

 

4)ArrayIndexOutOfBoundsException:배열이나 List에서 사용할 수 없는 인덱스를 사용한 경우

 

5)Ai=rithmeticException:산술 연산 예외

 

6.예외처리 방법

try{

           예외가 발생할 가능성이 있는 코드

}catch(예외처리 클래스이름 변수명){

           예외처리클래스이름에 해당하는 예외가 발생했을 때 처리할 구문

}catch 클래스이름이 다르면 여러 개 반복 사용가능

finally{

           예외 발생 여부에 상관없이 무조건 수행할 구문

}

=>try.가 나오면 catch1개 이상나오거나 finally가 반드시 나와야 합니다.

=>finally에는 대부분 외부 자원(파일 , 네트워크 , 데이터베이스 등)을 사용했을 때 정리하는 코드가 작성이 됩니다.

프로그램에서 file close()안하고 사용중 일경우 다른 데는 읽기 전용으로 뜬다.

 

 

 

 

 

 

빠른 것과 늦은 것 이 했을 경우 빠른 것이 뻥난다.

토큰은 로그아웃하고 하는게 좋다.

토큰을 반납작업을 해야 한다. finally에 해야 한다.

finally 안테 만들지 않고  catch다음에 적어도 수행되던데 왜 finally?

finally에 작성한 문장은 catch구문을 수행한 다음에 실행된다는 보장을 할 수 있지만 finally가 아닌 영역에 적은 것은 catch구문 수행 후에 된다는 보장을 할 수 없습니다.

 

 

순서가  random하게 출력한다.

 

 

그래서 아래처럼 수정한다.

                       int [] ar = {100,200};

                       System.out.println("예외처리의 목적");

                       try {

                                  System.out.println(ar[2]);

                       }catch(Exception e){//예외 발생

                                  System.err.println(e.getMessage()+"발생");

                       }finally {

                                  System.out.println("예외처리의 목적중 하나는 예외가 발생하더라도 계속 작업을 수행하기 위해서입니다.");

                       }

 

python에서는

try:

except IndexError as e:

 

except ? as e:

 

finally:

 

 

line : 5

****0

***1*2

**3***4

*5*****6

789012345

for(int i = 0; i< line ; i++){

           공백 : 4 3 2 1 0    

           j = 0 ; j < 4-i ; j++   => 4 + (-1)*i

 

           if(i == 0){//첫번째 줄

                       System.out.println(su % 10);

                       su = su+1;

           }

           else if(i == line -1){//마지막줄

                       //2*line -1

                       j = 0  j< 2*line -1

                       su1씩 증가하면서 출력

           }

           else{//중간이것

                       System.out.println(su % 10);

                       su = su +1;

                      

                       2 * i -1 개 공백 출력                 

 

                       System.out.println(su % 10);

                       su = su +1;

           }

}

%10하면 절대로 9나눌 수 없다.

 

 

***

***

***

 

*

**

***

 

***

**

*

 

*

**

*

 

 

quick sort

5          3          8          9          6          2          7

 

 

pivot

j

 

pivot을 기준으로 왼쪽에는 pivot 보다 작은 값 오른쪽에는 pivot보다 큰 값

 

left :

right:6

 

pivot = left

j = pivot

pivot 위치의 데이터와 오른쪽에 있는 모든 데이터를 비교한다. 비교해서 pivot위치의 데이터보다 작은 데이터를 만나면 j1증가시켜서 j번째 데이터와 교체를 한다.

반복문 한바퀴를 돌린다.

반복문이 끝나면 pivot 위치의 데이터와 j번째 데이터를 교체한다.

pivotj 로 교체

 

       i = 1

5          3          8          9          6          2          7

 

 

pivot

j

 

5하고 3비교해서 j -> j+1 i3이다.

i 2  8하고 비교 .

i 3  9하고 비교

i 4  j증가 해서 2가 되고  2하고 8교체했다.

i 5  7하고 비교

pivot j 2이고 5하고 2바꾼다.

왼쪽에는 5보다 작고 큰 것은 오른쪽에 있다.

 

==============>

left 부터 pivot -1자리 까지

pivot +1  -> right까지

이 두개 영역으로 분할해서 다시 수행

=>여기서 재귀가 만들어진다.

 

쪼개서 계속 한다. 1개가 될때 까지 계속한다.

 

 

반응형

'Study > Java' 카테고리의 다른 글

java-9  (0) 2020.09.29
java-8  (0) 2020.09.28
java-6  (0) 2020.09.26
java-5  (0) 2020.09.24
java-4  (0) 2020.09.22

+ Recent posts