일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Excel
- 캐시
- JPA
- thymeleaf
- Java
- 프로토타입
- javascript
- Singleton
- HTTP
- Kotlin
- BEAN
- di
- Security
- js
- 라이프 사이클
- DB
- vue-cli
- cache
- HTTP 메서드
- Repository
- vuex
- Vue.js
- dependency injection
- Stateless
- Spring
- 의존성 주입
- 싱글톤
- 로그인
- Setter
- VUE
- Today
- Total
jhhan의 블로그
Java의 정석을 시작하자(2)(2/5) 본문
6장부터는 자바언어(객체지향언어)의 특징이 나오기 시작한다.
6장. 객체지향 프로그래밍1
-객체지향언어의 특징
- 코드의 재사용성이 높다. : 새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성 가능
- 코드의 관리가 용이 : 코드간의 관계를 이용 -> 적은 노력으로 코드 변경 가능
- 신뢰성 높은 프로그래밍 가능 : 제어자 & 메서드 이용 -> 데이터 보호, 올바른 값 유지, 코드의 중복 제거 -> 오동작 방지
-클래스
- 정의 : 객체를 정의해 놓은 것
- 객체의 설계도 라고 이해하면 편하다
- 용도 : 객체를 생성하는데 사용
-객체
- 실제로 존재하는 것
- 유형의 객체뿐만 아니라 개념 & 논리 같은 것도 객체로 간주한다.
- 속성과 기능의 집합
- 속성 -> 멤버변수 , 기능 -> 메서드
-인스턴스
- 어떤 클래스로부터 만들어진 객체
- 인스턴스화 : 어떤 클래스로부터 객체를 만드는 과정
- 인스턴스와 객체는 같은 의미이긴 하지만 객체가 훨씬 더 넓은 의미
- ex) Tv클래스로부터 만들어진 객체는 Tv클래스의 인스턴스이다.
- ex) '책상은 인스턴스다' 보다는 '책상은 객체다' 가 더 자연스럽다.
- ex) '책상은 책상 클래스의 객체다' 보다는 '책상은 책상 클래스의 인스턴스다' 가 더 자연스럽다.
-객체의 생성
- 클래스명 변수명 = new 클래스명();
- ex) Tv t = new Tv();
** class TV로 정의 후
** TV t = new TV(); 로 인스턴스(객체)를 생성한다.
** 변수에도 접근해서 사용할 수 있다.
** 결과값은 9가 출력된다.
-클래스의 또 다른 정의
- 변수 -> 배열 -> 구조체 -> 클래스로 발전
- 변수 : 하나의 데이터를 저장하는 공간
- 배열 : 같은 타입의 여러 데이터를 저장하는 공간
- 구조체 : 타입에 관계없이 데이터를 저장하는 공간
- 클래스 : 구조체 + 함수
-변수
- 3가지의 변수가 존재한다.
- 인스턴스변수, 클래스변수, 지역변수
- 인스턴스변수
- 클래스 영역에 선언
- 인스턴스마다 다른 값 저장 가능
- 인스턴스가 생성된 후 접근 가능하다.
- 참조변수.인스턴스변수명 으로 접근 가능
- ex) Tv t = new Tv(); t.channel = 9; // channel이 인스턴스변수이다.
- 클래스변수
- 클래스 영역에 선언
- static으로 선언된다. ex) static int size = 200;
- 모든 인스턴스들이 공유
- 인스턴스를 생성하지 않고 사용가능
- 클래스명.클래스변수명 으로 접근가능
- 클래스가 로딩될 때 생성된다.
- 지역변수
- 메서드 내에 선언
- 메서드 내에서만 사용 가능하다.
- 메서드의 종료와 함께 소멸
- 블럭을 벗어나면 소멸, 사용할 수 없다.
** kind와 number는 인스턴스변수 -> 인스턴스를 생성한 후에 사용할 수 있다.
** width와 height는 클래스변수 -> 인스턴스 생성없이 사용할 수 있다.
** 코드에 대한 출력이다.
** 인스턴스변수는 인스턴스마다 다르게 출력된다.
** 클래스변수는 인스턴스에 상관없이 같은 값이 출력된다.
-메서드
- 작업을 수행하기 위한 명령문들의 집합
- 수학의 함수와 비슷하다고 생각하면 편함.
- 클래스 영역에서만 정의 가능
- 호출방법 : 참조변수.메서드이름(); or 참조변수.메서드이름(매개변수1, 매개변수2, ...);
- 인스턴스메서드와 클래스메서드로 구분한다.
- 인스턴스메서드
- 인스턴스 생성 후 사용 가능
- 메서드 내에서 인스턴스변수, 클래스변수 모두 사용가능
- 클래스메서드
- static메서드라고도 불린다. (static이 붙기 때문이다.)
- 인스턴스를 생성하지 않아도 사용 가능
- 클래스명.메서드이름()으로 호출
- 메서드 내에서 인스턴스변수 사용 불가능
- 인스턴스변수를 사용하지 않을 때 -> static을 붙이는 것을 고려!
** 클래스메서드와 인스턴스메서드를 선언했다.
** 클래스메서드는 인스턴스 생성없이 사용가능하다.
** 인스턴스메서드는 인스턴스 생성 후 사용이 가능하다.
** 결과값은 곱셈의 결과가 잘 나온다.
-오버로딩 : 하나의 클래스에 같은 이름의 메서드를 여러 개 정의하는 것
- 조건1. 메서드 이름이 같아야 함.
- 조건2. 매개변수의 개수 또는 타입이 달라야 함.
- 리턴 타입은 구현하는데 영향을 주지 못한다.
- ex) void println(); void println(int x); void println(char x)
- ex처럼 이름이 같고 매개변수 타입이 다르기 때문에 오버로딩된 것이다.
** add()메소드를 오버로딩 했다.
** 만약 오버로딩이 잘못하면, 컴파일 시 add()가 이미 정의 되었다고 뜰 것이다.
** 결과값은 잘 나온다.
-생성자 : 인스턴스가 생성될 때마다 호출되는 인스턴스 초기화 메서드
- 모든 클래스에는 하나이상의 생성자가 존재함
- 조건
- 생성자의 이름은 클래스의 이름과 같다.
- 리턴값이 없다.
- 기본 생성자 : 매개변수가 없는 생성자 & 생성자가 없으면 컴파일러에서 자동으로 추가하는 생성자
- this() : 생성자에서 다른 생성자 호출
- 조건
- 생성자 이름으로 클래스이름 대신 this 사용
- 반드시 첫 줄에서만 호출 가능
** class Car이 있을 때
** Car() 생성자 안에서 다른 생성자를 호출할 때
** Car 대신 this를 사용한다.
- this : 객체 자신을 가리키는 참조변수
** 인스턴스변수와 지역변수를 구분하기 위해 사용한다.
** this.color : 인스턴스변수
** color : 매개변수
-변수 초기화
- 멤버변수는 각타입의 기본값으로 자동초기화 되어서 초기화를 안해도 됨.
- 지역변수는 그러지 않기 때문에 반드시 초기화 필요 --> 변수 파트에서 초기화가 필요했던 이유
-멤버변수의 초기화
- 명시적 초기화 : 일반적인 초기화 방법 ex) int door = 5;
- 생성자 : 생성자를 통해 초기화 한다.
- 초기화 블럭 : 인스턴스 초기화 블럭, 클래스 초기화 블럭이 있다.
- 클래스 초기화 블럭
- 클래스 변수의 복잡한 초기화에 사용
- 클래스가 로딩될 때 실행
- 인스턴스 초기화 블럭
- 인스턴스변수의 복잡한 초기화에 사용
- 인스턴스가 생성될 때마다 실행
- 생성자보다 먼저 실행
** 클래스 초기화 블럭과 인스턴스 초기화 블럭, 생성자를 모두 만들어 놓았다.
** 결과를 보면 main메서드가 실행된 후 클래스가 로딩되고, 클래스 초기화 블럭이 수행된다. ( 메모리에 로딩될 때 클래스 초기화 블럭이 가장 먼저 수행되는 경우도 있다. 이건 경우에 따라서 다른 것 같다. )
** 클래스 초기화 블럭은 초반에 한번 수행된다.
** 인스턴스 초기화 블럭은 인스턴스가 생성될 때마다 수행된다.
7장. 객체지향 프로그래밍2
-상속 : 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것
- 두 클래스를 조상과 자손 관계로 연결시킨다.
- JAVA는 단일상속만을 허용! (C++에서는 다중상속을 허용한다.)
- Object클래스가 모든 클래스의 최고조상
- 모든 클래스는 자동으로 Object클래스 상속받음
-오버라이딩 : 조상클래스에서 상속받은 메서드의 내용을 변경하는 것
- 선언부가 같아야 함(이름, 매개변수, 리턴타입)
- 접근제어자는 같거나 넓은 범위로만 변경 가능
- 조상클래스보다 많은 수의 예외 선언 안됨 - 8장 예외처리와 관련
** Point3D클래스가 Point클래스를 상속한다.
** Point가 조상클래스, Point3D가 자손클래스가 된다.
** getlocation()이 오버라이딩 되어서 같은 메서드이지만 다르게 출력된다.
-오버로딩과 오버라이딩
- 오버로딩 : 기존에 없는 새로운 메서드 정의(new)
- 오버라이딩 : 상속받은 메서드의 내용 변경(change, modify)
-super() : 조상의 생성자 호출
- 생성자는 상속되지 않기 때문
- 자손클래스가 인스턴스 생성 시 조상의 멤버들도 초기화 됨.
- 자손 생성자에서 조상의 생성차 호출이 필요하다 -> super()를 사용한다.
-패키지 : 클래스의 묶음
- 서로 관련된 클래스 & 인터페이스를 묶음
- 패키지는 물리적으로 폴더 , 서브패키지를 가질 수 있음
- 선언 : 첫번째 문장 , 단 한번만 선언 가능
- ex) package 패키지명;
-import문
- 사용할 클래스가 속한 패키지 지정시 사용
- 사용하면 클래스를 사용할 때 패키지명 생략 가능
- java.lang같은 패키지는 import하지 않아도 사용가능
- package문과 클래스선언 사이에 선언
-제어자 : 클래스, 변수, 메서드 선언부에 함께 사용되어 부가적인 의미 부여
- 접근 제어자 : public, protected, default, private
- 그 외 : static, final, abstract, synchronized, ... 등
-static : 앞에서 살펴봄 - 멤버변수 , 메서드에 붙음
-final
- 변수 : 값을 변경할 수 없는 상수가 된다.
- 메서드 : 변경될 수 없는 메서드, 오버라이딩이 안된다.
- 클래스 : 변경될 수 없는 클래스, 조상클래스가 될 수 없다.
-abstract : 미완성 이라는 의미를 지닌다.
- 클래스 : 추상클래스를 의미함
- 메서드 : 추상메서드 의미, 선언부만 작성되고 구현부는 미작성
-접근 제어자
- 멤버나 클래스에 사용 -> 외부로부터의 접근 제한
- private : 같은 클래스 내에서 사용 가능
- default : 같은 패키지 내에서 사용 가능
- protected : 같은 패키지, 다른 패키지의 자손 클래스에서 접근 가능
- public : 접근 제한 없음
- 사용 이유 : 데이터 보호, 내부적으로만 사용되는 부분 감추기 위해서이다.
-다형성(Polymorphism)
- 여러가지 형태를 가질 수 있는 능력
- 서로 상속관계에서 사용가능
- 조상타입의 참조변수로 자손타입의 객체를 다룰 수 있음
- 반대로 자손타입의 참조변수로 조상타입의 객체는 못 다룬다.
- ex) TV - 조상 , CaptionTV - 자손 일 때
- Tv t = new CaptionTV(); // 가능
- CaptionTV c = new TV(); // 불가능
- instanceof 연산자 : 이항연산자. 인스턴스의 실제 타입을 체크하는데 사용
- 참조변수와 인스턴스변수의 연결
- 멤버변수 중복정의 : 참조변수 타입에 영향 받음
- 메서드 중복정의 : 실제 인스턴스의 타입에만 영향받음
-추상 클래스 : 추상메서드를 포함하는 클래스
- 일반 메서드가 추상메서드 호출 가능
- 인스턴스 생성 불가능
- 도움을 줄 목적으로 작성된 클래스
- 추상클래스를 상속받으면 - 추상메서드의 구현부분을 완성해야 함
-인터페이스 : 추상클래스의 일종, but 추상화 정도가 높음
- 실제 구현된 것이 없는 기본 설계도 라고 이해하자
- 추상메서드와 상수만을 변수로 갖는다.
- 클래스와 달리 다중 상속 허용, implements로 상속한다.
- 장점
- 개발시간 단축
- 표준화 가능
- 관계없는 클래스 -> 관계있는 클래스로 만들어 줄 수 있음
- 독립적인 프로그래밍 가능
- 디폴트 메서드 : 인터페이스에 새로운 메서드가 추가될 때의 문제점을 해결하기 위해 고안
- 디폴트 메서드는 무시된다.
-내부클래스 : 클래스 안에 선언된 클래스
- 외부클래스의 멤버들을 쉽게 접근할 수 있다.
- 코드 복잡성을 줄일 수 있다.(캡슐화)
- 인스턴스클래스 : 인스턴스변수처럼 선언된다.
- 스태틱클래스 : static멤버처럼 다뤄짐
- 지역클래스 : 선언된 영역 내부에서만 사용 - 메서드나 초기화블럭 안쪽
- 익명 클래스 : 클래스 선언과 객체생성을 동시에 하는 이름없는 클래스 - 일회용
- 인스턴스클래스를 사용하기 위해서 먼저 외부클래스로 인스턴스를 먼저 생성해야 한다.
- 스태틱클래스는 외부클래스 생성없이 사용가능 , static멤버만 사용 가능
** 외부클래스와 내부클래스의 모습을 보여준다.
** 스태틱클래스의 클래스변수는 인스턴스 생성없이 쓸 수 있다.
** 스태틱클래스의 인스턴스변수는 인스턴스를 생성한 후 사용할 수 있다.
** 인스턴스클래스의 인스턴스변수는 외부클래스의 인스턴스를 생성한 후 사용할 수 있다.
** 결과값이다.
8장. 예외처리
-오류
- 컴파일 에러: 컴파일 할 때 발생하는 에러
- 런타임 에러: 실행할 때 발생하는 에러
- 논리적 에러: 의도와 다르게 동작해서 발생하는 에러
-에러와 예외
- 에러 : 심각한 오류 - 코드에 의해 수습될 수 없다.
- 예외 : 미약한 오류 - 코드에 의해 수습될 수 있다.
-Exception 클래스 : 모든 예외의 최고 조상
- Exception클래스 : 외적인 요인에 의해 발생
- RuntimeExcpetion클래스 : 프로그래머의 실수로 발생
- 두 그룹으로 나눌 수 있다.
-예외처리의 목적 : 프로그램의 비정상 종료를 막고 정상적인 실행 상태 유지
-구문 : try-catch문 or try-catch-finally문
- try문에서 실행
- 예외 발생 시 catch 블럭으로 가서 해당 예외가 있는지 확인
- 있다면 catch문 실행
- 없다면 예외처리가 되지 않는다.
- 예외가 발생하지 않으면 try-catch문이 종료된다.
- 만약 finally블럭도 같이 있다면 try->finally or try->catch->finally로 진행된다.
** try문에서 예외가 발생하지 않는다.
** catch문은 실행되지 않는다.
** 결과는 1 2 3 5 로 출력된다.
** try문에 에러가 발생한다. (0으로 나누어서 오류 생김)
** catch 블럭에 ArithmeticException이 있으므로 해당 catch문으로 간다.
** catch문에 있는 내용을 수행한 후 try-catch문이 종료된다.
** 결과는 1 2 4 5 로 출력된다.
-printStackTrace() & getMessage()
- printStackTrace() : 예외 발생 당시의 호출스택에 있었던 메서드의 정보와 예외 메시지를 출력
- getMessage() : 발생한 예외클래스의 인스턴스에 저장된 메시지 얻을 수 있음
** try문에서 예외 발생
** catch블럭으로 가서 catch문 실행
** printStackTrace()와 getMessage()가 실행된다.
** 예제에 대한 결과물
** 각각에 대해 결과가 나왔다.
-예외 발생시키기 : 프로그래머가 고의로 예외를 발생시킬 수도 있다.
** 고의로 예외를 발생하는 예제이다.
** 주석에 나와있는 것처럼 한줄로 처리할 수도 있다.
** 예외가 발생되었다고 나온다.
8장 나머지 부분은 다음 부분에서 이어갈 것이다.
'JAVA' 카테고리의 다른 글
Java의 정석을 시작하자(4)(2/7) (0) | 2020.02.14 |
---|---|
Java의 정석을 시작하자(4)(2/7) (0) | 2020.02.13 |
Java의 정석을 시작하자(3)(2/6) (0) | 2020.02.13 |
Java의 정석을 시작하자(1)(2/3~2/4) (0) | 2020.02.12 |
Java를 시작하면서 (0) | 2020.02.12 |