끄적끄적 코딩
728x90

객체 지향 프로그래밍이란? (Object Oriented Programming)

객체란?
주체가 아닌 것, 주체가 활용하는 것
객체지향 프로그래밍 주변의 많은 것들을 객체화 해서 프로그래밍 하는 것

장점 
블록 형태의 모듈화된 프로그래밍 신뢰성 높은 프로그래밍이 가능 추가/수정/삭제가 용이 재사용성이 높다
현실의 객체가 갖는 속성과 기능은 추상화 되어 클래스에 정의된다. 클래스는 구체화 되어 프로그램의 객체가 된다.

프로그래밍을 통해서 추상화를 함
=> 클래스를 작성함 (클래스는 멤버변수와 멤버메서드로 이루어짐)
=> 클래스를 찍어내는 과정을 객체화
=> 찍어낸 객체에 값을 넣어주는 과정을 구체화

클래스
객체를 정의해 놓은 것 즉 객체의 설계도, 틀
클래스는 직접 사용할 수 없고, 직접 사용되는 객체를 만들기 위한 틀을 제공할 뿐

객체

클래스를 데이터 타입으로 메모리에 생성된 것

객체 생성과 메모리
JVM의 메모리 구조
class area
- 클래스 원형 로딩
(필드 정보, 메소드 정보, 타입 정보, 상수 풀)

method stack - 메서드들의 실행 공간
(쓰레드별로 별도관리, 메서드 호출 순서대로 쌓이는 구조, 메서드 프레임에 로컬 변수도 쌓이는 구조)

heap - 객체를 저장하기 위한 영역
(쓰레드에 의해 공유, 생성된 객체는 프로그래머가 삭제할 수 없고 GC만이 제어 가능)


변수의 종류

      변수 종류                         선언 위치
클래스 멤버 변수     -- 클래스 영역(static keyword)
인스턴스 멤버 변수 -- 클래스 영역 지역변수
지역변수                 -- 함수 내부
파라미터 변수         -- 함수 선언부

인스턴스 멤버 변수
선언위치 : 클래스 {}영역에 선언

public class person { 
  String name; 
  int age; 
}


변수의 생성 : 객체가 만들어질 때 객체 별로 생성됨 (생성 메모리 영역 : heap)
변수의 초기화 : 타입 별로 default 초기화
변수에의 접근 : 객체 생성 후 (메모리에 올린 후) 객체 이름(소속)으로 접근
소멸 시점 : GC에 의해, 프로그래머가 명시적으로 불가능

클래스 멤버 변수
선언 위치 : 클래스 {}영역에 선언되며 static 키워드를 붙임

public class Person { 
  static String scientificName = "Homo Sapiens"; 
  String name; 
}

변수의 생성 : 클래스 영역에 클래스 로딩 시 메모리 등록
변수의 초기화 : 타입 별로 default 초기화
변수에의 접근 : 객체 생성과 무관하게 클래스 이름(소속)으로 접근
소멸 시점 : 프로그램 종료 시


지역변수 & 파라미터 변수

선언 위치 : 클래스 영역의 {} 이외의 모든 중괄호 안에 선언되는 변수들 

 void call(String to){ 
  String beep = "띠";
  for(int i=0; i<3; i++){ 
    System.out.println(beep); 
  } 
}

변수의 생성 : 선언된 라인이 실행될 때 생성
메모리 영역 : 쓰레드 별로 생성된 stack 영역
변수의 초기화 : 사용하기 전 명시적 초기화 필요
변수에의 접근 : 외부에서는 접근이 불가하므로 소속 불필요
소멸 시점 : 선언된 영역인 {} 을 벗어날 때


메서드란

현실의 객체가 하는 동작을 프로그래밍 화
어떤 작업을 수행하는 명령문의 집합

메서드를 작성하는 이유
반복적으로 사용되는 코드의 중복 방지
코드의 양을 줄일 수 있고 유지 보수가 용이함

class Person { 
  String name; 
  int age=0; 
  void printInfo(){ 
    System.out.println(name + " : " + age); 
  } 
}

선언부
리턴타입
호출 결과, 호출한 곳으로 반환되는 값의 타입으로 아무것도 리턴하지 않을 경우 void
결과를 받을 때 묵시적 형 변환 적용
리턴 타입은 하나만 적용 가능

메서드 이름
메서드가 수행하는 작업을 쉽게 파악하도록 의미 있는 이름 사용

파라미터 목록
메서드 호출 시점에 넘겨줘야 하는 변수들로 넘겨줄 정보가 없을 경우 생략 가능
파라미터 전달 시 묵시적 형변환 적용

Variable arguments
메서드 선언 시 몇 개의 인자가 들어올 지 예상할 수 없을 경우 (또는 가변적)
  - 배열 타입을 선언할 수 있으나 -> 메서드 호출 전 배열을 생성, 초기화 해야하는 번거로움
  - ... 을 이용해 파라미터를 선언하면 호출 시 넘겨준 값의 개수에 따라 자동으로 배열 생성 및 초기화

구현부
구현부는 중괄호 내에서 처리해야 하는 내용 즉 비즈니스 로직 작성
마지막에는 선언된 리턴 타입에 해당하는 값을 return 문장과 함께 반환해야 함

메서드 호출
메서드를 호출할 떄는 메서드의 선언부에 맞춰 호출해야하 함
  - 메서드 이름 : 반드시 동일
  - 파라미터 : 선언된 파라미터의 개수는 반드시 동일, 타입은 promotion 적용 가능
메서드 접근
  - 멤버 변수와 마찬가지로 static 또는 non static 상태를 구분해서 호출 


메서드 오버로딩
동일한 기능을 수행하는 메서드의 추가 작성
같은 메서드에서 다른 파라미터를 받아서 비슷한 내용을 수행 기억해야 할 메서드가 감소하고 중복 코드에 대한 효율적 관리 가능

오버로딩 규칙

  1. 같은 클래스 안에 있는 메소드(연산자X, 변수X)
  2. 이름이 같아야 한다.
  3. 전달되는 매개변수의 개수가 타입이 달라야 한다.
  4. 반환타입은 상관이 없다.


생성자
객체를 생성할 때 호출하는 메서드 비슷한 것
  - new 키워드와 함게 호출하는 것
  - 일반 멤버 변수의 초기화나 객체 생성 시 실행돼야 하는 작업 정리

작성 규칙
  - 메서드와 비슷하나 리턴 타입이 없고 이름은 클래스 이름과 동일

* 모든 메소드는 반드시 정의하고 사용 되어야 한다.
* 기본 생성자는 만들지 않아도 자동 생성 된다.

파라미터가 있는 생성자
- 생성자의 목적이 일반 멤버 변수의 초기화 -> 생성자 호출 시 값을 넘겨줘서 초기화
- 파라미터가 있는 생성자를 만들면 기본 생성자는 추가되지 않는다


this

참조 변수로써 객체 자신을 가리킴
- 참조변수를 통해 객체의 멤버에 접근했던 것처럼 this를 이용해 자신의 멤버에 접근 가능
용도
- 로컬 변수와 멤버 변수의 이름이 동일할 경우 멤버 변수임을 명시적으로 나타냄
- 명시적으로 멤버임을 나타낼 경우 사용

static class Person { 
  int loc = 1; 
  void pr() { 
    int loc = 2; 
    System.out.Println(loc); // 2 
    System.out.Println(this.loc); // 1 
  } 
}

 

  1. this.변수   => 멤버변수
  2. this()         => 생성자가 다른 (같은) 생성자 호출할때
  3. this           => 생성자에서 또 다른 (같은)생성자를 부를때

 

검색 태그