jhhan의 블로그

Java의 정석을 시작하자(2)(2/5) 본문

JAVA

Java의 정석을 시작하자(2)(2/5)

jhhan000 2020. 2. 12. 14:18

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 사용
    • 반드시 첫 줄에서만 호출 가능

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