728x90

객체 지향 프로그래밍(Object-Oriented Programming: OPP)은 데이터와 절차를 하나의 덩어리(객체)로 묶어서 생각하는 방법이다.
객체 안의 변수를 필드(field)라 부르고, 객체 안의 함수를 메소드(method)라 부른다.
하나의 객체(Object)는 필드와 메소들 이루어진 소프트웨어의 묶음이다.

자바는 객체 지향 기법을 지원하지만 객체 지향을 사용한다고 해서 절차 지향 프로그램을 하지 않는다는 것이 아니다. 실제로 객체의 내부를 설계할 때는 절차 지향 프로그래밍을 사용한다.


절차지향 언어의 특징

- 절차 지향 프로그래밍이란, 프로그래밍을 순서, 즉 절차에 따라 프로그래밍하는 것을 의미한다.

- 절차 지향의 대표적인 프로그램은 C언어이다.


객체지향 언어의 특징

- 사람(주체)가 바라본 대상(사람, 사물, 객체 등)을 객체(object)라고 한다.

- 객체지향 언어는 사람이 일상적으로 보고, 느끼고, 생각하는 관점에서 프로그래밍을 하는 것이다.

- 객체 지향 프로그램의 첫번째 단계는 객체의 추출이다.

  객체는 각각 속성과 기능들을 가진다.


Class (클래스)

- 클래스는 설계서(붕어빵틀)다. 즉, 실체가 아니라 타입이다.

- Java의 모든 클래스는 Object 클래스를 상속한다.

- new 명령으로 해당 클래스 타입의 객체를 생성한 후, 그 객체에 데이터를 저장하고, 그 객체의 멤버 메소드를 실행하는 것이다.

  Contacts phonebook; // 클래스 타입 변수 선언

  phonebook = new Contacts(); // 전화번호부 실제 객체 생성 (변수 = new 클래스명();)

  인스턴스 변수는 반드시 객체를 생성해야만 호출이 가능하다.

  참조 변수 지정과 객체 생성을 한번에 할 수 있다.

  Contacts phonebook = new Contacts(); // 전화번호부 객체 생성, Class 타입 변수명 = new 생성자 ();

  phonebook .number = "010-0000-0000"; // Class 인스턴스를 생성한 다음 참조변수 phonebook 을 통해야 한다.

  참조변수의 특징은 메모리에 생성되어 있는 인스턴스의 위치값을 지정한다.

- final 메소드는 Class 상속되는 것은 허용하되, 메소드의 오버라이딩은 허용하지 않겠다는 의미다.


메서드(함수)가 호출되면 수행에 필요한 만큼의 메모리 스택에 할당을 받는다.

메서드(함수)가 수행을 마치고 나면 사용했던 메모리를 반환하고 스택에서 제거된다.


같은 Class 에 속한 멤버들 간에는 별도의 인스턴스를 생성하지 않고도 서로 참조 또는 호출이 가능하다.

static 메서드(함수)는 인스턴스 메서드를 호출할 수 없다.

인스턴스 메서드(함수)는 인스턴스 메서드와 클래스 메서드 모두 인스턴스 생성없이 바로 호출이 가능하다.

클래스 변수가 인스턴스 변수를 참조, 호출하기 위해서는 반드시 객체를 생성해야 한다.


참조형 변수는 메모리에 생성되어 있는 인스턴스의 위치값을 저장한다.


 Premitive Type 변수

 - byte, short, int, long, float, double, char, boolean 8가지 타입을 제공한다.

 - type 마다 size가 fix 되어 있다.
 - 기본값이 있으므로 null이 존재하지 않는다.
 - generic을 이용할 때 필요한 wraper class가 존재한다. (Integer, Long..)
 - 컴파일 시, 크기를 초과하면 에러가 발생한다.

 Reference Type 변수

 - 기본형을 제외한 모든 타입은 Reference Type 이며 java.lang.Object 를 상속 받는다.

 - 참조형에는 Class Type, Interface Type, Array Type이 있다.

 - 기본값은 아무런 참조 정보가 없으므로 null을 리턴한다.

 - 생성된 객체는 Heap Memory 에 저장된다.

 primitive type의 == 연산은 값을 비교한다.
 reference type의 == 연산은 주소를 비교한다.
 리터럴 방식을 통해 만든 변수와, new를 통해 저장되는 메모리가 다르다.
 두 변수의 참조 메모리가 서로 다르다는 뜻이다.
 reference 타입에서 설명한 대로 new로 만든 객체는 Heap 영역에 저장이 되고,
 리터럴 방식으로 만들어진 객체는 String Constant Pool영역에 저장되기 때문이다.

 primitive Type은 value를 전달한다.
 reference Type은 reference를 전달한다.


 String은 reference Type 으로 다른 reference Type과 다른점은 JVM에서 String constant pool을 이용해 메모리 관리를 한다.

 - if(str == input) {} // str 이 String 변수이면 == 로 비교할 수 없다.

 - if(str.equals(input)) 으로 비교해야 한다.

 변수는 사용하기 전에 선언되어야 한다. 변수의 선언이란 "이름"과 "타입"을 정해주는 것이다.

 Java 에서 변수의 선언은 Class 내에 선언한다.

 main 함수는 C언어에서는 1개만 존재하지만, Java 에서는 Class 파일마다 존재해도 된다.

 - 메서드 내부에 선언된 변수는 그 메서드 내부에서만 사용 가능하다.

 - 메서드 외부(클래스 내부)에 선언된 변수는 클래스 내에서 사용 가능하다.



생성자(Constructor)는 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드다.

- 생성자의 이름은 클래스 이름과 같아야 한다.

- 생성자는 리턴값이 없다.

- 생성자는 매개변수가 없는 것도 있고, 있는 것도 있다.

- 클래스가 객체 생성될 때 맨 처음 호출되는 것이다.

- 모든 클래스는 반드시 하나 이상의 생성자가 정의되어 있어야 한다.

  만약, 생성자가 하나도 정의되어 있지 않는 경우,

  컴파일러는 자동으로 매개변수가 없는(no-parameter) 기본 생성자를 추가하여 컴파일 한다.

- 사용자가 생성자를 구현해주면 no-parameter 생성자는 자동으로 추가되지 않는다.

  생성자를 직접 만들어 줄 경우에는 no-parameter 생성자를 함께 만들어주는 것을 습관화하는 것이 좋다.

- 모든 서브 클래스의 생성자는 먼저 수퍼 클래스의 생성자를 호출한다.

  1. super(매개변수)를 통해 명시적으로 호출을 해준다.

  2. super(매개변수)를 명시적으로 지정하지 않으면 자동으로 no-parameter 생성자가 호출된다.


※ 흔한 오류

    수퍼클래스에 no-parameter 생성자가 없는데, 서브 클래스의 생성자에서 super() 호출을 안해주는 경우


super
- 자신을 가리키는 키워드가 this 라면, 부모를 가리키는 키워드는 super
- super() 는 부모의 생성자를 의미한다.
- 부모의 생성자를 임의로 호출하지 않으면, 부모 class의 기본(no-parameter) 생성자가 자동으로 호출된다.
- 명시적으로 호출하지 않으면 super()를 컴파일 시 자동으로 추가된다.

public class Contacts {
    public Contacts(){  // default 생성자 = no-parameter 생성자     

       // 클래스 인스턴스를 메모리에 생성한다.

       // 주로 인스턴스 변수를 초기화한다.

    }   
}


Contacts pbook = new Contacts(); // default  생성자 호출

default 생성자 호출시 default 생성자가 안 만들어져 있으면 오류가 발생한다.



public class Value {

   // Java에서는 클래스 외부에는 변수를 선언할 수 없다.

    public static final String IPADDRESS = "http://10.100.100.2";  // 서버의 IP주소

    String number;

}


getDbData(Value.IPADDRESS + "/get_json.php");


- 클래스 정적(static) 변수는 객체 생성없이 직접 사용이 가능하다.

- 클래스이름.메서드이름(Value.IPADDRESS) 과 같은 식으로 호출이 가능하다.

- 클래스 정적 변수는 모든 인스턴스가 하나의 저장공간을 가지므로 항상 공통된 값을 갖는다.

  모든 인스턴스에 공통된 값을 유지해야 하는 경우에 static을 붙인다.

  프로그램 실행시 static 지정자가 붙은 멤버들은 단 한번의 실행으로 메모리에 생성된다.

  프로그램 종료 시 메모리에서 소멸된다.


접근 제한자

접근 제한자는 Class 의 멤버에 대해 다른 Class 에서 접근하는 것을 제한하는 용도로 사용된다.

- public : 모든 Class 에서 접근 가능

- protected : 같은 패키지에 있는 Class, 그리고 다른 패키지의 자손 클래스에서 접근이 가능

- default : 같은 패키지에 있는 Class 들만 접근 가능

  String name; // 아무런 접근 지정자도 지정되지 않았으므로 default 접근 지정자다.

- private : 같은 Class 내에서만 접근 가능


지시자

클래스 내부

동일 패키지

상속받은 클래스

이외의 영역

 private


 X

X

X

 default


X

X

 protected


X

 public



- 클래스의 멤버 변수에 접근할 때에는 기본적으로 getter/setter 메서드를 사용하여 간접 접근을 해야 한다.


클래스 상속(inheritance)

public class SearchActivity extends Activity {
}

public class MainActivity extends AppCompatActivity {

       // ....

}

public class Child extends Parent {
}

- 상속이란 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.

- 상속을 받는다는 것은 조상 클래스(Activity)를 확장(extends)한다는 의미로 해석할 수 있다.

  상속은 강한 연결고리를 형성한다.

  복합관계는 강한 연결고리를 형성하지 않는다.

- 자바는 단일 상속만 허용하고 다중 상속은 허용하지 않는다.

  C++ 에서는 여러 클래스로부터 상속받는 다중상속을 허용한다.

  public class Child extends Parent1, Parent2 { // 이와 같은 표현은 허용하지 않는다.

  }

- 모든 상속 계층의 최상위에는 Object 클래스가 위치한다.

- 생성자와 초기화 블럭은  상속되지 않는다. 멤버만 상속된다.

- 클래스 속성과 기능들을 다른 클래스에서 재사용할 수 있다.

- 중복 코드를 제거하면 가독성이 높아지고 개발 시간을 단축할 수 있다.

- 각 클래스의 공통점을 가진 클래스를 부모 클래스로 만든다.


추상(abstract) 클래스

- 미완성 설계도

- 추상 클래스로 인스턴스는 생성할 수 없다.

  추상 클래스는 상속을 통해서 자손 클래스에 의해서만 완성할 수 있다.

- 추상 클래스는 abstract 를 붙이기만 하면 된다.



오버라이딩(overriding)

조상(상위) 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다.

- 상위 클래스에 정의된 이름, 반환형, 매개변수 선언까지 완전히 동일한 메소드를 하위 클래스에서 다시 정의하는 것이다.

- 하위 클래스에 정의된 메소드에 의해 상위 클래스의 메소드는 가리워진다.

overriding 의 조건

- 이름이 같아야 한다.

- 매개변수가 같아야 한다.

- 리턴타입이 같아야 한다.

- static, final, private 가 지정된 메소드는 오바라이딩 불가

  super.toString(); 처럼 부모 클래스 메소드를 호출하거나, private 를 protected 로 변수명을 변경하면 상속이 가능하다.



다형성(Polymorphism)

- 수퍼클래스 타입의 참조변수가 서브클래스 타입의 객체를 참조할 수 있다.

   Computer test = new Notebook();



method overloading

같은 클래스 내에서 변수와 마찬가지로 메소드도 서로 구별할 수 있어야 한다.

하지만 자바에서는 같은 클래스 내에서 아래와 같은 조건이면 동일 이름을 가진 메소드를 정의할 수 있다.

1. 메소드 이름이 같아야 한다.

2. 메소드이 매개변수의 개수 또는 매개변수의 타입이 달라야 한다.

3. 매개변수는 같고 리턴타입이 다른 것은 오버로딩이 성립되지 않는다.

오버로딩의 조건

  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.
  3. 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.
    (리턴타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.)

 



출처: https://java.ihoney.pe.kr/99 [허니몬(Honeymon)의 자바guru]

오버로딩의 조건

  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.
  3. 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.
    (리턴타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.)

 



출처: https://java.ihoney.pe.kr/99 [허니몬(Honeymon)의 자바guru]


오버로딩의 조건

  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.
  3. 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.
    (리턴타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.)


출처: https://java.ihoney.pe.kr/99 [허니몬(Honeymon)의 자바guru]


패키지(package)

package com.tistory.link2me.addresschart;


- 패키지란, 클래스의 묶음이다.

- 하나의 소스파일에는 최상단에 단 한번의 패키지 선언을 허용한다.

- 패키지명은 선언시 반드시 소문자로 선언해야 한다.

- 모든 클래스는 반드시 하나의 패키지에 속해야 한다.

- 패키지는 점(.)을 구분자로 하여 계층 구조로 구성할 수 있다.

- 패키지는 물리적으로 클래스 파일(.class)을 포함하는 하나의 디렉토리이다.


import 문

import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;


- 다른 패키지의 클래스를 사용하려면 패키지명이 포함된 클래스 이름을 사용해야 한다.

- 하지만, 클래스의 코드를 작성하기 전에 import 문으로 사용하고자 하는 클래스의 패키지를

  미리 명시해 주면 소스코드에 사용되는 클래스 이름에서 패키지명을 생략할 수 있다.


'안드로이드 > Java 문법' 카테고리의 다른 글

[Java] 정보은닉과 캡슐화  (0) 2017.10.16
자바 기본 데이터형과 크기  (0) 2017.10.11
ArrayList and HashMap  (0) 2017.03.06
Java foreach 문  (0) 2017.03.01
자바 배열과 기본 문법  (0) 2016.07.11
블로그 이미지

Link2Me

,