아래 내용은 남궁성 저자님의 “자바의 정석 기초편" 유튜브 강의를 들으며 개인적으로 정리한 내용입니다!
실제 강의 수강을 강력히 권장드리며, “자바의 정석" 책을 구매하시는 것도 추천드립니다.
→ https://www.youtube.com/watch?v=D7XvKPQsEa0&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp
객체지향 프로그래밍(OOP)란?
클래스/객체
클래스란 OOP에서 사용하는 객체를 만들어내기 위한 틀/설계도라고 생각하면 된다.
객체는 모든 인스턴스를 대표하는 일반적 용어이며, 인스턴스는 특정 클래스로부터 생성된 객체를 말한다. [ 클래스 → (인스턴스화) → 인스턴스(객체) ]
이때 객체는 속성(변수)과 기능(메서드)로 나뉜다.
클래스와 객체
클래스
데이터와 함수를 정의한 객체의 설계도이며, 사용자가 원하는 타입을 정의할 수 있다.
클래스 선언법
클래스는 클래스영역과 메서드영역으로 나뉜다.
class Myclass {
// 클래스 영역
int iv; // 인스턴스 변수
static int cv; // 클래스 변수
void method (){
// 메서드 영역
int lv = 0; // 지역 변수
}
}
Java
복사
이때 어느 영역에 변수를 선언하느냐에 따라 변수의 사용법도 달라진다.
변수 종류 | 선언 위치 | 특징 | 생성시기 | 초기화 |
클래스 변수(static변수, 공유변수) | 클래스 영역 | 객체 선언 없이도 사용 가능
→ 모든 객체에서 공유하는 값 저장
→ 값 수정 시, 해당 클래스의 모든 객체에도 전부 수정 적용
클래스의 모든 영역에서 사용 가능 | 클래스가 메모리에 올라갈 때 | 생성 시 자동 초기화 |
인스턴스 변수 | 클래스 영역 | 클래스의 모든 영역에서 사용 가능 | 인스턴스가 생성되었을 때 | 생성 시 자동 초기화 |
지역 변수 | 클래스 영역 이외 영역 | 메서드 영역 내에서만 사용가능 | 변수 선언문이 수행되었을 때 | 직접 수동 초기화를 해야한다. |
메서드 선언법
메서드는 작업단위로 묶어 이름을 붙인 것이다. 값을 입력 받아 처리 후 → 결과를 반환(출력)한다.
메서드를 사용하면 코드 중복을 줄이고, 작업의 재사용과 관리가 쉬워지는 장점이 있다.
메서드는 가급적 한 가지 기능만 수행하도록 작성하는 것이 좋다.
메서드는 선언부와 구현부로 나뉜다.
이렇게 작성한 메서드는 객체.메서드() 형식으로 실행하면 된다.
// 선언부 -> 파랑색 부분
// 구현부 -> 주황색 부분
반환타입 메서드이름 (타입 변수명, 타입 변수명, ...)
{
// 메서드 호출 시 수행되는 코드
}
/////////////////////////////////
class Myclass {
// ...
int add(int x, int y){
int result = x + y;
return result;
}
}
Myclass test = new Myclass();
int x = 10;
int y = 20;
// 30
System.out.println(test.add(x, y));
Java
복사
메서드의 종류
인스턴스 변수를 사용할 수 있느냐 없느냐에 따라 크게 인스턴스 메서드와 클래스 메서드로 나뉜다.
•
인스턴스 메서드
◦
인스턴스 멤버와 관련된 작업을 하는 메서드이다.
◦
인스턴스 생성 후, 참조변수.메서드이름() 으로 호출한다.
◦
메서드 내에서 인스턴스 변수 사용가능
•
클래스 메서드(static 메서드)
◦
객체 생성 없이 클래스이름.메서드이름() 으로 호출한다.
◦
인스턴스 멤버와 관련없는 작업을 하는 메서드이다.
◦
메서드 내에서 인스턴스 변수 사용불가
◦
클래스 내의 인스턴스 메서드 사용불가
오버로딩(overloading)
하나의 클래스안에 동일한 메서드를 여러 개 정의하여 사용하는 것을 말한다. 오버로딩은 하나의 아래 3가지의 조건이 만족하는 메서드들이다.
오버로딩을 사용하여 동일한 이름으로 매개변수에 따라 다른 동작을 하도록 만들 수 있다.
1.
메서드 이름이 동일하다.
2.
매개변수의 갯수나 타입이 달라야한다. → 매개변수의 갯수와 타입이 완전히 동일하면 오버로딩이 아니다.
3.
반환 값의 타입은 달라도 상관없다.
오버로딩 예시
생성자(constructor)
인스턴스가 생성될 때마다 호출되는 인스턴스 초기화 메서드이다. 생성자는 아래 2가지 조건을 만족해야 사용할 수 있다.
1.
생성자 메서드의 이름이 반드시 클래스 이름과 같아야한다.
2.
리턴 값이 존재하지 않으며, void 도 붙이지 않는다.
모든 클래스는 반드시 1개 이상의 생성자를 가지고 있으며, 별도로 정의하지 않는 경우 컴파일러가 기본 생성자를 자동으로 생성해준다.
평소 정의한 클래스를 사용할 때 무심히 사용하던 [클래스명] [변수명] = new [클래스명]() 에서 [클래스명]() 이 기본적으로 만들어진 생성자이다.
만약 정의된 클래스명이 Myclass 일 경우, Myclass varclass = new Myclass() 에서 Myclass() 라는 생성자를 사용하는 것이다.
이때 생성자를 별도로 다시 정의해 원하는 로직이 실행되도록 만들 수 있으며, 매개변수도 설정이 가능하다.
생성자 예시
매개변수의 종류
매개변수로 넘어가는 값의 타입이 기본형 타입(int, float …)인지 참조형 타입(String, Custom_Class …)인지에 따라 값을 넘기는 방식이 달라진다.
•
기본형 매개변수 : 변수의 값을 읽기만 가능하다. (Read Only) → 메서드로 넘길 때, 값을 복사하여 넘긴다.
•
참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다.(Read & Write) → 메서드로 넘길 때, 인스턴스의 주소를 복사하여 넘긴다.
클래스 작성 시 주의점
•
만약 public class가 있는 경우, 소스파일의 이름은 반드시 public class의 이름과 일치(대소문자 구분)해야한다.
•
public class 는 하나의 소스파일에 1개만 존재해야한다.
•
만약 public class가 없는 경우, 소스파일의 이름은 아무거나 가능하다.
객체
각 객체는 별도의 저장공간을 가지며, 하나의 객체의 속성을 바꾸어도 다른 객체의 속성은 바뀌지 않는다.
•
클래스명 변수명; : 클래스의 객체를 참조하기 위한 참조변수 선언
•
변수명 = new 클래스명(); : 클래스의 새로운 객체를 생성 후, 객체의 주소를 참조변수에 저장
•
변수.속성; : 객체의 속성 값을 얻는다.
•
변수.메서드(); : 객체의 메서드를 호출한다.
•
객체변수1 = 객체변수2; : 객체변수2는 이제 객체변수1이 참조하는 객체를 참조하게 된다.
•
클래스명[] 객체배열 = new 클래스명[길이]; : 새로운 객체 배열(참조변수 배열)을 생성한다.
this(), this
this()는 생성자에서 다른 생성자를 호출할 때 사용한다. 이때 다른 생성자를 호출하면 첫 줄에서만 사용 가능하다.
this()는 매개변수가 없는 기본 생성자, this(매개변수)는 매개변수가 존재하는 생성자를 호출한다.
this() 예시
this는 인스턴스 자기 자신을 가르키는 참조 변수이다. 생성자를 포함한 인스턴스 메서드에서 사용 가능하다.
이는 인스턴스 메서드의 지역변수(lv)와 인스턴스 변수(iv)를 구분하기 위해 사용된다.
this 예시
초기화 블럭(initialization block)
자바에서는 멤버변수(cv, lv)의 초기화 방법이 3가지 존재한다.
1.
= 을 이용한 명시적 초기화
2.
생성자를 이용한 초기화
3.
초기화 블럭을 이용한 초기화
초기화 블럭은 3번 방법인 초기화 블럭을 이용한 초기화에서 사용한다.
기본적으로 클래스의 생성자보다 먼저 실행되며, static 사용 여부에 따라 2가지로 구분한다.
크게 인스턴스 초기화 블럭과 클래스 초기화 블럭으로 구분할 수 있다.
초기화 블럭안에서는 반복문, 조건문등 다양한 제어문을 사용할 수 있기 때문에 복잡한 초기화 작업에 사용된다.
인스턴스 초기화 블럭
인스턴스 초기화 블럭은 {} 을 이용해 정의할 수 있다.
인스턴스가 생성될 때 마다 동작한다.
인스턴스 초기화 블럭 예시
클래스 초기화 블럭
클래스 초기화 블럭도 {} 을 이용해 정의할 수 있다. 하지만 인스턴스 초기화 블럭과는 다르게 static 이 붙는다.
클래스 생성 시 최초 1번만 동작한다.
클래스 초기화 블럭 예시
상속
…작성중…