ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java OOP 정리
    Java 2018. 7. 5. 01:45
    반응형

    Class와 객체
     *객체 지향 프로그래밍 : OOP(Object Oriented Programming)

    객체 지향 프로그래밍이란? → 원하는 대상을 추상화 하여 프로그램 상에서 만드는 것이다. 프로그램을 완성하기 위해 필요한 부분 조립해 완성해 나가는 방식이다.

    ex) 로봇을 만들기 위해 팔,다리,머리,몸통을 조립해 완성해 나간다.

    OOP의 특성 4가지
     1. 추상화: 프로그램이 필요로 하는 실제 데이터들을 모델링 기술
     2. 캡슐화: 객체 지향의 가장 중요한 데이터 보호 기술 <정보 은닉: 접근 제한 자를 사용하여 class 내부의 데이터를 외부로부터 접근을 막고 데이터를 보호하는 기술>
     3. 상속: class의 재 사용과 소스 코드의 중복 제거를 목적으로 하는 기술
     4. 다형성: 상속을 이용해 여러 class 타입을 하나의 class 타입으로 Class와 객체 class → 객체를 만들기 위한 객체의 설계도 역할을 한다. 접근 제한 자를 주어 데이터를 보호할 수 있다. 멤버 변수들을 하나의 타입으로 묶어 준다. 객체 → 인스턴스라고도 하며, 프로그램에 필요한 멤버 변수들을 모델링 해 놓은 곳이다 객체화 → 객체를 참조하여 데이터가 존재하는 실체로 만드는 과정 new 키워드를 사용해 동적 메모리에 할당한다. 할당된 객체의 주소를 참조하여 객체 변수 값들을 처리한다.

    ** java의 특정 class, method를 알아보려면 ** → http://docs.oracle.com/javase/8/docs/api 홈페이지를 참고하면 된다.
    Eclipse에서도 Ctrl + Space로 자동 완성 기능으로도 알아볼 수 있다. 
    프로그램 설계 시 Class Diagram을 통해 class 간 관계를 볼 수 있다.

    Class와 객체 접근 제한 자 → class 내부 데이터를 외부로부터 접근으로부터 제한할 수 있다.
    접근 제한 자의 종류 → public : 모든 class 가 접근 가능
    default : 같은 패키지에 속한 class 만 접근 가능
    Protected : 상속을 안 하면 default와 같다. 같은 패키지에 속한 class 간 접근이 가능 서로 다른 패키지일 때는 상속 관계있는 cla ss 만 접근 가능
    private : 멤버 변수를 캡슐화 하기 위한 제한, class 내부에서 만 접근 가능
    공개 범위 : public > protected > default > private
    UML표기: (+) (#) (~)생략 가능 (-)

    ** 접근 제한하는 것을 캡슐화 라고 한다.**

    Class와 객체 class 구조 → class는 class 헤더와 class 바디로 구성된다. 첫 글자는 대문자로 써야 한다. java를 실행하기 위해서는 하나 이상의 class가 있어야 한다. class 헤더 → class 작성 시 이름과 종류를 정의하는 시그니처 선언은 [접근 제한 자][class 식별자][class][class 이름] ex) public abstract class Test {} 접근 제한 → public class : 모두 접근 가능한 class class : 선언된 패키지 안에서만 접근 가능한 class

    Class와 객체 class 식별자 → public final class : 종단 class, 더 이상 상속 시킬 수 없다
    ** final 키워드는 한번 지정되면 프로그램 종료까지 변경이 불가능하다.
    생성자에서만 초기화 가능하다 static final의 경우 초기화가 되지 않아 불변의 값으로 간주한다.
    final 이 붙은 method는 Override 할 수 없다.
    final 이 붙은 class 는 상속 받을 수 없다. → public abstract class : 추상 class, 상속을 이용해 후손 class가 부모 cl ass의 미완성된 기능 을 완성할 수 있다.
    Import → class를 객체화 할 때 다른 package에 있는 class를 불러 올 경우 import문을 사용 한다.

    Class와 객체 멤버 변수 → class의 소속된 멤버 변수와 상수를 필드라고 한다. class 내부에 선언한다. class멤버라고 부르기도 한다.
    ** 멤버에는 Constructor, Field, Method 가 있다.
    ** Field → 인스턴스 변수 : 객체 공간 안에 생성되는 필드다, class내의 선언.
    class 변수 : 자료형 앞에 static을 붙여 선언한 필드다 해당 class형 객체 모두가 공유하는 필드로 class내의 선언
    Ststic → static을 붙이면 그 영역에 바로 저장이 된다.
    static member는 객체화 하지 않고 사용한다. 초기화가 불가능하기 때문에 static block을 사용하여 초기화 한다.
    지역 변수 → method내에 선언되며, method내에서만 실행되었다가 method가 종료 되면 사용할 수 없다.
    method → Class 내에 있는 함수로-, 멤버class 변수들로 동작한다.

    객체 Method 시그니처 선언 : [접근 제한 자][반환 형][Method 이름(인자 값 )] 선언 할 때 매개변수가 있는 경우와 없는 경우로 구분 할 수 있다.
    -인자 값이 있는 method일 때 값을 return 해줘야 한다.
    -인자 값이 없는 method일 때 전달 값만 method 안에 기입한다.
    인스턴스 method → 객체의 주소를 전달 받아 해당 주소 위치에 있는 인스턴스 변수 값들을 연산 처리한다.
    Class method → method 반환 자료형 앞에 static을 사용한 method 인스턴스 method와 다르게 참조를 사용하지 않고 직접 class 명으로 사 용한다. method Overloading → 하나의 class 내에서 이름이 같은 method를 만들 수 있다.

    생성자 Class와 객체 → 객체 생성시 인스턴스 변수의 초기화를 담당하는 method이다.
    class에는 하나 이상의 생성자가 있어야 한다. (없다면 JVM에 의해 컴파일시 자동으로 생성된다.)
    생성자는 이름이 반드시 class명과 동일 해야 하고 return 타입이 없다.
    Overloading이 가능하므로 여러 개의 생성자를 만들 수 있다.
    기본 생성자 → 매개변수가 없는 생성자이다. 매개변수가 있는 생성자가 한 개 이상 있는 경우 기본 생성자는 없어도 된다.
    매개변수가 있는 생성자 → Overloading이 가능하므로 매개변수가 있는 생성자와 기본 생성자 모두 사용 가능하다.
    this() 생성자와 this 레퍼런스 변수 → 자기 참조 변수라고 한다.
    class 내의 정의된 필드나 method에 접근 가능한 레퍼런스 변수다.
    this() 생성자 : 생성자 내에서 해당 class의 다른 생성자를 호출 할 때 사용한다. 첫 줄 에 this를 기입해야 한다.

    상속 → 기존의 class를 재 사용하여 새로운 class를 작성하는 것을 말한다.
    즉 부모 class(기존 class)의 것은 자식 class(새로운 class)에서 사용 가능
    상속의 사용법 → 부모 class에서 private 접근 필드를 갖는 맴버는 상속이 불가능하다.
    java에서는 상속 받을 class를 선택하며 다중 상속은 허용하지 않는다.
    상속을 위해서는 extends 키워드를 사용한다.
    선언: public class (자식 class) extends (부모 class) 상속의 특징 → 부모 class를 상속 받으면 부모 class 호출 없이 부모 class method 사 용 가능.
    자식 class를 상속 받기 위해서는 부모 class가 객체화 되어야 한다.
    자식 생성자가 실행 될 경우 자동으로 부모 생성자를 먼저 호출한다 (이때 부모 생성자 super()는 생략된다.)
    생성자 호출 순서를 이용하면 자식 class 객체화 시 부모 class 초기화가 가능 method Override → method 재정의 하는 것으로 부모 class로부터 상속받은 method를 자식 class 에서 다시 정의하는 것을 말한다.
    바인딩 → method Chapter07 에 대한 호출과 실제 구현된-method 상속의 코드와 연결되는 것 바인딩에는 동적 바인딩과 정적 바인딩이 있다.
    동적 바인딩: 객체의 타입이 실행 중에 결정되는 것을 말하며 상속 관계의 Override 된 method가 동적 바인딩 을 한다.
    정적 바인딩: 객체의 타입이 컴파일러에 의해 컴파일되는 시점 에 결정되는 것을 말하며 priv ate, final, static 은 모두 정적 바인딩이 된다. super 레퍼런스와 super() 생성자 → 자식 class에서 부모 class의 생성자나 맴버에 접근하고 싶을 때 super를 사용
    super: 부모 class의 맴버를 지칭할 때 사용
    super(): 부모 class의 생성자를 호출하는데 사용할 수 있다. (단 반드시 자식 생성자 {} 안 첫 줄 에 사용해야 한다.)
    다형성 → 다형성은 OOP 의 주요 특징 중 하나 이다.
    다형성은 여러가지 타입을 한 가지 타입으로 처리할 수 있는 기술이다.
    즉 같은 부모를 상속 받은 class 는 같은 Type으로 들어 갈 수 있다는 뜻 이다.

    추상class, 인터페이스 → 공통되고 중요한 것을 뽑아온다.
    꼭 구현 해야 하는 기능만 가져온다.
    추상 method로 꼭 구현해야 하는 method 등의 규격을 만들 수 있다.
    추상 method를 통해 꼭 구현할 method를 Override 할 수 있다.
    추상화 class, method를 선언 하기 위해서는 abstract 라는 키워드를 써 야 한다. ex) public abstract class Mammal 추상 class는 객체화 할 수 없으며 자식 class 외엔 부를 수 없다.
    추상 class 의 생성자에 접근 하고 싶다면 super( ) 를 호출 해야 한다.
    추상 method → 추상 method 형태만 있고,그 몸체는 없는 method를 말한다.
    추상 method는 특정한 method를 강제로 override 해야 할 경우 설정 추상 method는 선언 부와 구현 부로 나뉜다.
    추상 class에서 추상 method 제공 이유는? 추상 class를 상속 받아 만들어지는 후손 class들이 method를 선언과 동일하게 재 정의해서 사용하라는 의미이다(강제성도 있음)
    ** 추상 class는 상속해서 사용해야 한다. **
    ** 추상 class는 외부에서 사용 할 수 없다.(객체화가 안된다.) **
    ** 외부에서는 추상 class를 볼 수 없다. ** (상속되어 있는 자식class만 볼 수 있다.)

    인터페이스 Interface → Interface 는 서로 다른 요소들의 접점을 의미 한다.
    Interface 도 추상 method를 통해 공동 작업 시 규격을 잡아주는 역할.
    Interface 내부에는 모든 method가 추상 method이므로 abstract키워드 생략이 가능하다.(하지만 혼동이 있을 수 있어public abstract표기)
    다중 상속의 제한이 없어 여러 추상 method를 Interface로 작성함으로써 코드의 강제성을 부여 할 수 있다.
    여러 class에서 사용되는 동일한 상수는 인터페이스에 정의한 후 해당 상수를 공유 할 수 있게 하여 중복을 최소화 할 수 있다.
    Interface의 구현은 implements키워드를 활용한다.
    다중 구현이 가능하다 ex) implements [interfaceName, interfaceName] Interface도 상속이 가능하다.
    class와 차이점은 다중 상속이 가능하다는 점이다.
    인터페이스 장점 → Interface 이용하면 정의해야 하는 method를 표준화, 강제화 할 수 있다.
    method화 시켜야 하는 기능을 분류 안하고 구현만 하면 되어 시간 단축 일반 class 상속을 이용, 자식 class들의 관계를 맺는 것보다 간편하다.
    Interface abstract 키워드 Interface abstract 추상 method 사용 가능 abstract 추가시 사용 가능 일반 method default 키워드 추가시 사용 가능(jdk8) 사용 가능
    정적 method 사용 가능(jdk1.8) 사용 가능
    사용 실체 class가 implements하여 사용 실체 class가 extends하여 사용 사용개수 복수 개의 interface구현가능 1개의 abstract class 상속가능 객체화 불가능
    인터페이스 익명개체 → Interface는 익명 개체를 활용할 수 있다.
    익명 객체는 말 그대로 이름이 없는 객체이다. ex) CommonImplement: 인터페이스 상속받은 클래스 Common: 인터페이스 다형성 사용하지 않은경우 CommonImplement ci = new CommonImplement();
    다형성 사용한 경우 Common co;
    co=new CommonImplement();
    즉 Interface를 구현 받은 class는 다형성을 활용 할 수 있다.
    Interface 와 abstract class 의 사용 이유 → Interface와 추상화는 개발 시 전체적인 규격을 만들어 준다.
    Interface와 추상화를 활용 하면 모듈 간의 결합도가 감소, 유지보수가 편해진다.
    ** 결합도: 코드의 요소가 다른 것과 얼마나 강하게 연결되는가 정도
    ** 내부 class Chapter09 – 내부class → class 내부에 정의된 class 코드 복잡성을 줄일 수 있다.
    긴밀한 관계를 가지고 있는 class를 같이 두면 외부에 노출을 할 필요가 없다.
    기본 형식 : Class Outterclass { Class Innerclass {} } 컴파일 시 Outterclass$Innerclass.class 로 컴파일된다.
    내부 class의 종류 → Instance member class (멤버 내부 class) 안쪽 class를 인스턴스 변수처럼 사용하기 위한 class
    Static member class (정적 내부 class) static 키워드로 선언된 class로 포함한 class가 객체화 하면 사용 불가
    Local class (지역 내부 class) method 내에 지역변수처럼 선언한 class로 method 밖에서는 사용 불가
    Anonymus class (익명 class) 지역 class에서 변형된 형태. class이름을 지정하지 않고 생성 하나의 객체 만을 생성하며 일회용 class로 동작한다.
    에러 : 사용자가 처리 할수 없는 오류 –
    예외처리
    예외:사용자가 처리 할수 있는 오류 예외에는 크게 2가지 경우가 있다.
    일반 예외 : 실행을 하기 전 알 수 있다. (코딩한 문장에서 밑에 빨간 줄이 생김) 실행 예외:실행을 해봐야 알 수 있다.
    (실행 한 후에 콘솔 창에 예외의 경우와 몇 번째 줄에서 발생했 는지 나옴)
    실행예외의 종류 → NullPointException 참조하거나 사용한 class 또는 자료형이 초기화 되지 않은 경우 발생 (앞으로 가장 많이 접하게 될 것) ArrayIndexOutofBoundException 배열의 범위를 초과 하였을 경우 발생 (ex.3개의 배열을 생성하였는데 4개를 넣으려고 하는 경우) NumberFormatException 형변환시 형태가 맞게 저장되지 않을 경우 발생 (ex.숫자로 변환하려는데 중간에 문자가 섞여있으면 문자열로 인식)

    예외의 → 처리
    Try-Catch : 본인 스스로 처리 –
    예외처리 try : 예외가 발생할것 같은 부분
    catch : 예외 발생시 실행 할 부분
    finally : 예외가 발생하던 안하던 마지막에는 꼭 실행해야 할 부분 예외가 여러개 발생할 경우 → catch 구문을 여러 개 만들어서 처리하는 방법 하나의 catch 구문 안에 |(or) 연산자를 사용하여 처리하는 방법 예외의 경우는 모두 Exception을 상속 받기 때문에, 하나로 모든 예외를 처리하고 싶은 경우는 Exception으로 사용.
    Throws 책임 전가(그 일을 시킨 사람에게 다시 돌린다 -> 받은 사람은 그 일을 시킨 사람에게 다시 돌린다 . . . -> . . . -> . . .)
    ** main method에서도 책임을 전가 시에는 JVM 에서 처리하여 오류 메 세지를 표시해주기만 한다. (처리 X) ** 사용자 예외 → Java에서 제공하는 것만으론 다양한 종류의 예외를 표현할 수 없기 때문 에 사용. 중요한 것은 반드시 Exception | RuntimeException class를 상속 해야 한다.

    유용한 class → Java.lang package 가장 기본적 class가 들어있는 패키지이다.
    별도의 import 없이 사용 가능하다.
    Object class 자바의 모든 class가 직 간접적으로 상속 받는 최 상위 class 자바 모든 class의 기본 특징을 결정한다.
    String class 문자열을 사용하는데 가장 많이 사용하는 class String 객체가 생성되면 값을 변경할 수 없다.
    우리가 String 객체의 값을 바꾼다면, 본래 객체 외의 새로운 객 체를 생성하여 그 참조 주소를 가리키는 변수가 된다는 것이다.
    StringBuffer class와 StringBuilder class 문자열을 변경할 때마다 새로운 객체를 생성하는 String class 와 다르게 용량을 변화 시킬 수 있어 새로운 객체 생성 없이 문자열 수정 이 가능하다.
    ** StringBuffer class와 StringBuilder class 의 차이
    ** StringBuffer class만 동기화 지원한다는 것이다.

    Math class 수학적 기능을 가지는 method를 제공하는 class 객체를 생성하지 않고 사용한다.
    Wrapper class 자바의 기본형 데이터 타입을 class화 하기 위해 사용하는 class
    기본형 데이터 타입을 class화하면 Object class의 자식 class 가 되며 데이터 타입에 상관없이 Object class를 이용한 처리가 가능해 진다. Objects class Object class와 유사한 이름을 가진 class 객체 비교, 해시코드 생성, null 여부, 객체 문자열 리턴 등의 연산을 수행
    Random class 자바에서 난수를 발생시키는 방법 두 가지
    ** Math 클래스의 random()메소드를 이용하는 방법
    ** 객체를 사용 안해도 되지만 double 형태의 난수만 발생 시킬 수 있음
    ** Rancom class를 이용하는 방법
    ** 객체를 사용하지만 int, long, float, double, boolean 형의 난수. 

    박싱, 언박싱
    박싱: 기본형 데이터 타입을 객체화 시키는 작업
    언박싱: 객체에 저장되어 있는 데이터를 기본형 데이터로 꺼내는 작업

    자동 박싱/언박싱: 자바 JDK 1.5 이상부터는 기본 타입과 Wrapper clss 타입 간의 변환 이 자동으로 이루어진다.

    제너릭 → 다양한 타입의 객체들을 다루는 method나 class의 타입을 미리 명시해 줘서 컴파일 시 타입을 체크할 수 있도록 하는 것 형 변환을 하는 번거로움 없이 사용하게 해주는 것으로 배열이나 컬렉션 사용 시 데이터 타입의 안정성을 높일 수 있다.
    제네릭 선언 → 제네릭은 class와 method에 선언 가능 [접근 제한 자] class [class 이름] {} class를 선언할 때 class 이름 옆에 <> 를 이용하여 데이터 타입이나 타입 변수를 지정해주면 된다.
    두 개 이상의 타입으로 제네릭 타입 변수를 사용하고 싶다면 ,로 구분하 여 다른 이름으로 타입 변수를 지정해주면 된다.
    제너릭 method → method에서 사용할 타입을 제너릭을 이용하여 선언할 수 있다.
    [접근 제한 자] [반환 형][method이름](인자 값,..) {}

    제너릭 상속 → 제너릭 class도 다른 class와 마찬가지로 부모 class가 될 수 있다.
    부모 class의 제너릭 타입을 상속해서 자식 class에서도 제너릭 타입을 상속 ex) public class BasicInfo{...} public class DetailInfo extends BasicInfo {...} Wild Card Type & Type Bound → Wild Card 는 여러 파일이나 객체를 한꺼번에 지정 할 때 쓰인다.
    Type Bound 와 의 차이점: 전체와 상위 타입 제한이 있고 method에서 사용 : 제한 없음 → : 상위class 제한 : 하위class 제한

    컬렉션 → 자료구조를 바탕으로 객체들을 효율적으로 추가,검색, 삭제 할 수 있도록 자바에서 패키지에 컬렉션과 관련된 Interface와 class들을 모아 놓은 것
    ** 배열도 하나의 방법이 될 수는 있으나 크기가 정해져 있기 때문에 사용 시 문제가 발생할 수 있다.
    또한 객체 를 삭제 하게 되면 중간 중간 Null 값을 가지게 되어, 어디가 비어있는지 확인 작업이 필요하다.
    ** 컬렉션 프레임워크을 사용하는 이유 → 애플리케이션을 개발 하다 보면 다수의 객체를 저장해두고 필요 할 때마 다 꺼내 쓰는 경우가 발생한다.
    컬렉션의 종류 List / Set / Map 이렇게 3가지가 있다.
    Interface를 구현하여 사용되며 각 하위에서 사용되는 명령어들은 비슷 하다.
    그 이유는 같은 Interface를 사용하기 때문이다.

    컬렉션 List → 객체를 일렬로 늘어놓은 구조로 인덱스를 부여해 관리한다.
    Map → Key 값과 그에 따른 Value를 가지고 있는 형태로 Key는 중복될 수 없지 만 Value 는 중복 가능하다.
    기존에 저장된 키와 동일한 키가 들어오면 Value는 나중에 들 어온 값으로 덮어쓰기 된다.
    ex)사전 Set → 주머니 안에 여러가지의 물건을 담을 수 있으나 중복은 안된다.
    순서를 고려하지 않는다.
    검색 기능이 없기 때문에 찾기 위해서는 다 풀어 헤친 후에 확인해봐야 한다.
    Iterator를 사용: 전부 뽑은 다음에 하나 씩 확인) ex)로또볼 사용되는 문법 → hasNext(): 다음에 반복할 요소가 있는 지에 대한 값을 boolean 으로 리턴
    next(): 다음 요소에 대한 값
    remove(): 해당 요소를 지워줌.

    컬렉션 ArrayList → 배열과 같이 인덱스를 부여해 관리된다.
    하지만 배열은 크기를 바꿀 수 없지만 ArrayList는 자동으로 크기가 조정 된다.
    Vector → Array List와 똑같으나 사용 중에는 접근 할 수 없다는 차이점이 있음.
    LinkedList → 인접한 양옆 데이터를 기억하는 구조 중간에 데이터가 삽입 되었을 경우 Array List 보다 처리 속도가 월등히 빠르다. (이유는 객체가 변경 될 때 ArrayList는 변경 인덱스 뒤로 전부 움직이기 때문에 삭제와 삽입이 많은데 반해 Linked List는 양옆만 바꿔주면 되 기 때문이다.
    Hash Set → Collection 인터페이스를 사용하므로 기본적인 method가 같다.
    Hash Map → Coolection 인터페이스를 사용하지 않으므로, method가 조금 다르다. (Key, Value 사용)
    Hash Table → Hash Map과 동일하나 Vector 와 같이 사용 중에는 접근이 제한된다.
    LIFO(Last In First Out) → 나중에 들어온 것이 먼저 빠진다.
    Stack 메모리가 대표적. FIFO(First In First Out) → 먼저 들어온 것이 먼저 빠진다.

    반응형

    'Java' 카테고리의 다른 글

    Map과 List를 이용한 평균값 내기  (0) 2018.07.18
    STS, Elcipse - 기본 설정  (0) 2018.07.17
    JavaFX - CustomPopUp  (0) 2018.02.14
    JavaFX - FXML - Scene Builder  (0) 2018.02.08
    Java - JavaFX  (0) 2018.02.08

    댓글

Designed by Tistory.