본문 바로가기

Java

자바 객체 지향 클래스 / 메서드 / 생성자 /클래스 상속

 소프트웨어를 개발할 때에도 부품에 해당하는 객체들을 먼저 만들고, 
이것들을 하나씩 조립해서 완성된 프로그램을 만드는 기법을 객체 지향 프로그래밍 (OOP : Object Oriented 
Programming) 이라고 한다.

 

객체

객체 : 추상적인 것 중에서 자신의 속성과 동작을 가지는 모든 것 (물리적으로 존재하는) / 모델링이 가능

  -필드/변수(속성)
  -메소드(동작) 

객체들과의 관계

사용 / 상속(종류객체와 구체적인 사물객체간의) / 집합 (완성품과 부품간의)

 

객체 지향 프로그래밍

: 객체들을 하나씩 조립해서 만드는 프로그램

 

캡슐화

      객체의 뱐수와 메소드를 하나로 묶고, 은닉/감추는 것
      노출유무의 따라 접근제한자를 사용

상속

           변수와 메소드를 하위객체에게 물려줌

 


클래스

  • 설계도 역할으로써 객체를 만듬 ( 클래스를 실행시키기위해 객체를 만든다)
  • 객체들의 중요한 속성을 공유하는 객체들의 모임
  • 용도 : 라이브러리용 (API)
  • 클래스는 만들기만 해도 상관 없다 (메소드와 필드가 꼭 있을필요 없다)

 

객체 생성과 클래스 변수

new 연산자

new 클래스(); 는 힙이라는 메모리를 받고 그 객체안에서 저장이 가능하도록 힙 영역에 객체를 생성시킨 후 객체의 주소를 리턴하도록 () : 생성자를 호출하는 코드

클래스 변수 (객체명 / 인스턴스 ) = 클래스. 변수명

new연산자에 의해 리턴 된 객체의 번지 저장

클래스 변수 = new 클래스 ():

 

필드 : int fieldName;

변수선언 = “”;

 

필드 사용 위치

  • 같은 클래스에서 사용할시에는 : 변수이름 = (바로사용가능)
  • 다른 클래스에서 사용할시에는 : “변수 . 변수이름(가져올 클래스에서의 변수이름)” 으로 사용 ( MyCar . speed = x;
  • 다른위치의 클래스에서의 변수접근제안을 막을때에는 private를 사용함

—-다른위치에 있는 필드를 사용하는 이유

힙이라는 메모리에 변수들이 저장되는데

static의 main메소드는 저장공간이 따로 생성되기 때문에 한 공간의 힙에 존재하지 않기때문에 에러발생

따라서 static 메소드에는 새로는 객체(필드 = new필드();)를 생성하고 기존변수와 함께 결합해야한다 !

 


생성자 : ClassName() (..)

claculator = new calculator ();

클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당한다

개발자 선언한 생성자 존재 시 컴파일러는 기본 생성자 추가하지 않는다

new 연산자로 객체 생성시 개발자가 선언한 생성자 반드시 사용

 

필드초기화

클래스로 생성만 해놓은 필드(클래스 변수이름;)를 메소드를 만들어 초기화한다.

: 초기값 없이 선언된 필드가 객체 생성될 때 기본값으로 자동 설정되는 것

다른 값으로 필드 초기화하는방법

  1. 필드 선언할 때 초기값 설정 변수 이름;
  2. 힙메모리이름.필드이름 = 매게변수; (오류를 적게하는법) this.필드이름 = 매개변수; **(this변수 이용)**
  3. 생성자의 매개값으로 초기값 설정 클래스 = new 클래스 ();

 

생성자 오버로딩

똑같은 이름의 생성자를 여러개 만드는것 / 매개변수를 다르게 해야함

 

다른 생성자 호출 (this())

생성자의 첫줄에서만 허용

this. 필드이름 = 매개변수;

[this 는 맨 첫줄에]

 

 


메소드 : void methodName() (…)

객체의 동작(기능)인, {} 중괄호 블록 ( 중괄호의 블록의 이름= 메소드 이름)

생성자와의 차별점 : 리턴타입의 유무

( … ) : 갯수상관없이 넣어줘도 된다는 의미의 연산자

메소드 : return 할 땐 void

 

리턴타입

메소드가 실행 후 리턴하는 값의 타입

값이 없다면

 

메소드 이름

자바 식별자 규칙에 맞게 작성

 

메소드 매개변수 선언

매개변수는 메소드를 실행할 때 필요한 데이터를 외부에서 받기위해 사용

매개변수가 필요 없을 수도 있음 (없는것도 많음)

내 생성자 안에서 생성된 건 생성자나 메소드에서 내꺼처럼 접근해서 사용가능

다른 클래스의 변수를 가져다 쓸 때에는 변수.필드이름 으로 접근

 

리턴문 return

메소드 실행을 중지하고 리턴값을 지정하는 ( 마지막 리턴을 만나면 그 값을 위로 지정

return true; : 메소드 실행을 중지 시킬 수 있음

경우의 수 (if / for) 참 거짓 문장끝에 다 return을 걸어줘야하는 구문이 있음

 

메소드 호출

내부 : 그냥 호출

외부 : 객체생성 후 호출

 

메소드 오버로딩

메소드명이 같아야함/ 개수나 타입을 다르게해야함

서로 다른 시그니처를 갖는 여러 메소드를 같은 이름으로 정의하는 것

경우의 수를 매개변수에 다 입력할 떄 오버로딩으로 사용하는 것 (ex. 직사각형 만들 때)

클래스 내에 같은 이름으로 여러개의 메소드 만드는 것

public void

 

 


인스턴스 멤버

객체 마다 가지고 있는 필드와 메소드 (인스턴스 필드/ 인스턴스 메소드)

인스턴스 멤버는 개체 소속된 멤버이기 떄문에 객체가 없이 사용불가

힙 메모리에 다이렉트로 접근할 수 없고 힙의 메모리와 연결된 스택에게

 

this __this.

객체 자신의 참조를 가지고 있는 / 힙 메모리를 갖고 있는

인스턴스 멤버, 인스턴스 필드임을 정확하게 하기 위해 yhis.변수

필드값의

 

정적멤버와 static

공통적으로 사용하는 필드들을 위해 static을 사용한다

static은 무조건 “ 클래스이름. “ 으로 접근해야함!!!@

정적멤버는 클래스에 포함된 멤버

객체 내부에 존재하지 않고, 메소드 (클래스/ static) 영역에 존재

정적멤버는 객체를 생성하지 않고 클래스로 바로 접근해 사용

사용

내부사용 할때는 static이 붙여진 건 모두 같은 힙메모리 안에 있기 떄문에, = 정의 하지 않아도 변수를 그대로 가져다 쓸 수 있다.

외부사용 할때는 클래스.변수이름으로 바로 사용이 가능하다

 

정적초기화블록

static { ~~~~~~} 블럭안에서 쓸수있고, 따로 만들어 다른곳에서

 

정적 주의할 점 (static be careful)

객체생성하면 힙 메모리에 올라가고, static에서 동작하는 main 메소드에서는 다른 힙 메모리의 객체들을 사용하지 못한다는 내용

객체 생성 후 사용할 것

 

싱글톤

객체의 인스턴스가 오직 하나만 만들어지는

new 연산자를 통해서

하나를 만들어 놓고 가져다 쓰는 용도

<JSP / SPRING 에서 많이 사용>

singleton.getInstance() : 위에 있는 싱글톤 객체를 리턴하게 되는

public class Singleton {

    private static Singleton instance = new Singleton();

    private Singleton() {
        // 생성자는 외부에서 호출못하게 private 으로 지정해야 한다.
    }

    public static Singleton getInstance() {
        return instance;
    }

    public void say() {
        System.out.println("hi, there");
    }
}

상속

하나의 클래스만 물려받을 수 있다

outline

 


싱글톤

싱글톤_단 하나만 생성된 객체, 클래스 왜부에서 new연산자로 호출할 수 없도록 막아야함

그러므로 private 접근 제한자를 사용

private static 클래스명 singleton = new 필드명 ();

                     ___클래스 내부에서는 new연산자로 생성자 호출이 가능함.

 

자신의 타입인 정적필드를 하나 선언하고! 자신의 객체를 생성해 초기화 한다.

private 클래스명 () {}

 

static 필드명 getInstance()

{ return singleton; }

외부에서 호출할 수 있는 정적 메소드인 getInstance를 선언한 것. 그리고 정적 필드에서 참조하고 있는 자신의 객체를 리턴한것~!

=⇒외부에서 객체를 얻는 유일한 방법은 getInstance() 메소드를 호출하는 방법이다.

단 하나의 객체만 리턴하기 떄문에

 

 

Final

한 번 정의한 값을 바꾸지 못한다.

final String nation = “Korea”;

public —

nation=”UK”; ⇒ 못바꿈

 

패키지

클래스를 기능별로 묶어서 그룹 이름을 붙여 놓은 것 (=폴더랑 비슷한개념)

패키지는 단순히 파일 시스템의 폴더 기능만 하는것이 아니라 식별자 역할임

클래스 파일은 선언된 패키지와 동일한 폴더 안에서만 동작함

패키지가 만들어지고 - 그 안에 클래스가 컴파일되는 것이 패키지가 만들어지는 과정임

 

import문__(ctrl+shifr+O)

  • 다른 패키지에 있는 클래스를 사용하려할 때
  • import 패키지명.패키지명.패키지명_import. 클래스명.*;
  • 같은 패키지 안에 있으면 import가 필요없다

 

 

**System.

Java.lang에 들어있는 모든 클래스들은 import를 하지 않고 사용이 가능하다

 

접근제한자 Access Modifier

  • 같은 클래스의 메소드나 변수는 누구건 간에 사용이 가능 (소속이 같기 떄문에)
  • 같은 패키지에 있는 다른 클래스가 접속 하려 할 때 : public / protacted / default
  • 다른 패키지 : public / protacted (상속관계인 경우에는 사용가능)
  • 클래스를 선언할 때 public을 생략했다면 default 접근 제한을 가진다.
  • default : 같은 패키지에서는 아무런 제한 없이 사용할 수 있지만, 다른 패키지에선 사용 불가
  • public : 다른 패키지에서도 사용 가능  (access 레벨을 public으로 같이 맞춰주는거)

 

 

Getter Setter ( source사용할 것 )

Private를 사용했을 때

Getter

private 필드의 값을 리턴하는 역할 - 필요할 경우

  • boolean isStop () 으로 활용 ⇒ getstop이 아닌 불룬은 is 사용함

Setter

값을 설정하는

변수에 대한 외부접근을 차단시키고 메소드를 통하여 접근을 해야할 때