[JAVA 개념정리] 객체지향 Part1

Doyeon·2023년 1월 19일
0

JAVA 개념정리

목록 보기
10/13
post-thumbnail
post-custom-banner

객체지향 언어

  1. 재사용성
  2. 유지보수(관리가 쉽다)
  3. 신뢰성
    • 제어자, 메서드 → 데이터 보호, 올바른 값 유지
    • 중복 코드 제거 → 코드 불일치로 인한 오동작 방지

클래스와 객체

  • 클래스의 정의 : 객체를 정의해놓은 것
  • 클래스의 용도 : 객체를 생성하는데 사용
    • ex) 제품 설계도
  • 객체의 정의 : 실제로 존재하는 것. 사물 또는 개념
  • 객체의 용도 : 객체가 갖고 있는 기능과 속성에 따라 다름
    • ex) 제품 자체

      → 설계도를 잘 만들어 놓으면, 제품을 만드는 일이 쉽다.

      → 클래스는 객체를 생성하는데 사용될 뿐

      → 원하는 기능의 객체를 사용하기 위해서는 먼저 클래스로부터 객체를 생성하는 과정이 필요

객체와 인스턴스

  • 객체 : 모든 인스턴스를 대표하는 일반적 용어
  • 인스턴스 : 특정 클래스로부터 생성된 객체
  • 인스턴스화 : 클래스 → 인스턴스(객체)
  • 클래스에서 만들었으면 인스턴스라고 하자!

객체의 구성요소

  • 객체 = 속성(변수) + 기능(메서드)
  • 객체를 사용한다? → 객체가 가지고 있는 속성과 기능을 사용한다!
    class TV {
    	String color;
    	boolean power;
    	int channel;
    
    	void power() { power = !power;}
    	void channelUp() { channel++;}
    	void channelDown() { channel--;}
    }

한 파일에 여러 클래스 작성

  • 하나의 소스 파일에 둘 이상의 클래스 정의 가능
  • 단, 소스파일(*.java) 이름public class의 이름 과 일치해야 함

객체의 생성과 배열

객체의 생성

  • 클래스명 변수명;
    • 클래스의 객체를 참조하기 위한, 생성될 객체의 메모리 시작 주소를 담기 위한, 참조변수 선언
  • 변수명 = new 클래스명();
    • 생성된 객체의 주소를 참조변수에 저장
Tv t;  // Tv 클래스 타입의 참조변수 t 선언
t = new Tv();  // Tv 인스턴스 생성(new) 후, t에 주소를 저장

객체 배열

  • 객체 배열 == 참조변수 배열 → 배열 안에 객체가 저장되는 것이 아니라, 객체의 주소가 저장된다.
  • Tv[] tvArr = new Tv[3];
  • 여러 개의 객체을 담을 수 있는 배열
  • 배열을 생성하고 각 배열마다 객체를 생성해서 저장해야 한다.
Tv[] tvArr = new Tv[3];  // 참조변수 배열(객체 배열) 생성

// 객체 생성하여 각 배열에 저장 필요
tvArr[0] = **new Tv()**;
tvArr[1] = **new Tv();**
tvArr[2] = **new Tv();**

클래스의 정의

  • 클래스 == 데이터 + 함수
    • ex) String 클래스 : 문자열과 문자열을 다루는데 필요한 함수들을 함께 묶음
  • 클래스 == 사용자 정의 타입
    • 원하는 타입을 직접 만든다.
    • 제약조건을 반영하기 쉽다.(제어자 + 메서드 사용)

변수의 종류

클래스 영역 : 클래스 변수

  • static 변수(static + 인스턴스 변수)
  • 클래스가 메모리에 올라갈 때 생성
  • 인스턴스 생성하지 않아도 생성되고 언제든 사용 가능
  • 모든 인스턴스가 항상 동일한 값을 갖는다. (하나의 저장공간) → 한 인스턴스에서 값을 바꾸면 다른 인스턴스도 똑같이 바뀐다.
  • 클래스명.클래스변수명

클래스 영역 : 인스턴스 변수

  • 인스턴스(객체) 생성 시 생성
  • 인스턴스마다 각각 다른 상태를 유지해야하는 속성인 경우
  • 참조변수명.인스턴스변수명

메서드 영역 : 지역 변수

  • 메서드 호출되어 실행될 때 생성
  • 메서드 종료되면 자동 제거
  • 자동으로 초기화되지 않기 때문에 반드시 초기화 필요
  • 매개변수도 지역변수
class Card {
  // 인스턴스 변수 - 개별 속성을 지닌다.
	Stirng kind;   // 무늬
	int number;    // 숫자

  // 클래스 변수 - 공통 속성을 지닌다.
	**static** int width = 100;   // 폭
	**static** int height = 250;  // 넓이
}

메서드

반환타입 메서드이름 (타입 변수명, 타입 변수명, …) // (선언부 )
{
       // 메서드가 호출되면 수행할 코드 (구현부)
}

함수

  • 값을 입력 받아 처리하고, 결과를 반환한다.
  • void(반환타입) : 반환 값이 없을 때 사용
  • 매개변수(parameter) : 메서드가 수행하는데 필요한 입력 값으로 선언부에서 선언
  • 인수/인자(argument) : 메서드를 호출할 때 괄호() 안에 지정한 값

return

  • 실행 중인 메서드를 종료하고 호출한 곳으로 돌아감
  • 반환 타입이 void가 아닌 경우, 반드시 return 문 필요
  • void 일 경우, 컴파일러가 자동으로 return; 추가

호출 스택(call stack)

  • 메서드 수행에 필요한 메모리가 제공되는 공간
  • 메서드가 호출되면 호출 스택에 메모리가 할당, 종료되면 해제
  • 지역변수는 호출 스택(call stack) / 인스턴스 변수는 힙(heap) 영역에 생성

기본형 매개변수와 참조형 매개변수

기본형 매개변수

  • 변수의 값을 읽기만 할 수 있다. (read only)
  • 매개변수가 기본형 타입(int, char, float, …)

참조형 매개변수

  • 변수의 값을 읽고 변경할 수 있다. (read & write)
  • 매개변수가 참조형 타입(배열, 클래스)

static 메서드와 인스턴스 메서드

static 메서드(클래스 메서드)

  • 인스턴스 생성 없이 클래스이름.메서드이름() 으로 호출
    • ex) Math.random()
  • 인스턴스 멤버와 관련없는 작업을 하는 메서드
  • 메서드 내에서 인스턴스 변수 사용 불가
  • 클래스가 메모리 올라갈 때 생성되므로 메서드 호출시간이 짧다.

인스턴스 메서드

  • 인스턴스 생성 후, 참조변수.메서드이름() 으로 호출
  • 인스턴스 멤버와 관련된 작업을 하는 메서드
  • 메서드 내에서 인스턴스 변수 사용 가능

오버로딩(overloading)

한 클래스 안에 같은 이름의 메서드 여러 개 정의
1. 메서드 이름이 같아야 한다.
2. 매개변수 개수 또는 타입이 달라야 한다.
3. 반환 타입은 관계없다.

오버로딩 사용 목적

  • 입력하는 값이 다르지만 같은 기능을 수행하는 경우가 많을 때, 사용성 및 효율성을 높인다.
  • ex) println() → String, int, boolean, char, long … 어떤 타입의 매개변수를 지정해도 출력 가능하다.

생성자(constructor)

인스턴스가 생성될 때마다 호출되는 인스턴스 초기화 메서드
인스턴스 변수의 값을 초기화
1. 클래스 이름과 같아야 한다.
2. return 값이 없다.
3. void 붙이지 않는다.

  • 오버로딩 가능하다. → 하나의 클래스에 여러 개 생성자 가능
  • 생성자가 인스턴스를 생성하는 것이 아니다. 연산자 new가 인스턴스 생성!

기본 생성자(default constructor)

  • 매개변수가 없는 생성자
  • 생성자가 하나도 선언되지 않을 때, 컴파일러가 자동으로 추가해준다.
class Point {
	Point() { }   // 기본 생성자(default constructor)
  Point(int x, int y) { ... }  // 매개변수가 있는 생성자

this 와 this()

this

  • 인스턴스 자신을 가리키는 참조변수
  • 인스턴스 메서드(생성자 포함)에서 사용 가능
  • 지역 변수와 인스턴스 변수를 구별
    Car(String color, String gearType, int door) {
    	this.color = color;
    	this.gearType = gearType;
    	this.door = door;
    }

this()

  • 생성자에서 다른 생성자를 호출할 때 사용
    • this() 를 사용하지 않고 클래스명(); 으로 생성자 호출하면 Error
  • 다른 생성자 호출시 첫 줄에서만 사용 가능
    ```java
    class Car2 {
    	String color;
    	String gearType;
    	int door;
    
    	Car2() {
    		this("white", "auto", 4);
    	}
    
    	Car2(String color) {
    		this(color, "auto", 4);
    	}
    
    	Car2(String color, String gearType, int door) {
    		this.color = color;
    		this.gearType = gearType;
    		this.door = door;
    	}
    }
    ```

[참고] <Java의 정석 - 기초편>

profile
🔥
post-custom-banner

0개의 댓글