xx초등학교 1학년 9반 신입생 10명의 수학, 영어점수 데이터가 있다. 이를 C언어의 변수를 사용하여 저장한다면 각 점수 별 배열을 만들어 저장하거나 사람 별 구조체를 만들어 저장할 수 있다. 만약 해당 데이터에만 작동하는 함수를 만들고 싶다면 어떻게 해야할까? C에서는 함수를 구조체 바깥에 따로 만들어 사용했다. 이 어려움을 극복하고자 프로그래밍 언어자체에서 기능을 제공하여 구조체 + 함수 형태를 만들었다.
OOP(Object - Oriented Programming)
OOP(객체지향프로그래밍)은 프로그래밍 패러다임 중 하나이다. 프로그램 구성하는 기본 요소를 사람이 이해하기 쉬운 "Object(객체)"로 생각하고 프로그래밍 하려고 하는 것이다.
흔히 C 언어는 절차적 언어라고 하는데 이는 변수, 함수, 제어문으로 위에서 아래로 순서대로 실행되는 프로그래밍 언어이다. 객체지향도 사실 컴퓨터 내부적으로 절차적인 순서대로 실행되지만, 프로그래밍 할 때 추상화 작업을 거쳐 사람이 이 세상을 바라볼 때 객체 단위로 이해한다는 철학을 가지고 프로그래밍도 객체단위로 작성하는 것이다.
Class(클래스) 정의
객체지향프로그래밍은 "객체"를 표현하기 위해 "Class"를 사용한다.
클래스란 객체를 정의해주는 틀이다. 그 정의는 아래와 같다.
class Person {
// filed (멤버 변수)
int math;
int english;
int index;
int ages;
// method (함수)
int sum() {
return math + english;
}
// constructor (생성자)
public Person(int index) {
this.index = index;
this.ages = 8;
this.math = 0;
this.english = 0;
}
}
public class Main {
public static void main(String[] args) {
}
}
- 클래스 정의는 4가지로 구성으로 볼 수 있다.
- 접근 지정자
- 접근 지정자는 해당 클래스에 접근 범위를 제한한다.
- private, default(생략), protected, public
- class 키워드
- class 키워드를 사용하여 클래스 정의
- 클래스 이름
- 첫 문자가 문자, '_', '$'로 시작
- 첫 문자 숫자, 자바 키워드, 공백 사용 불가
- 대소문자 구분
- 길이제한없음
- { 클래스 body }
- filed(멤버 변수)
- method(함수)
- 생성자
- 접근 지정자
객체 만드는 방법 (new 키워드)
- 클래스를 통해 틀을 만들었다면 클래스를 이용하여 객체를 만든다.
- 예를 들어 붕어빵 틀이 있고 그곳에 반죽을 넣고 구우면 붕어빵이 되듯이 클래스를 정의하고 new 키워드를 사용해 객체를 만든다. 이때 객체를 만드는 과정 (클래스 → 객체)을 인스턴스화 라고 한다.
public class Main {
public static void main(String[] args) {
Person kukim = new Person(); // 객체 생성
}
}
// C언어
// 만약 person_t이라는 구조체가 있다고 한다면 위 자바 코드는 아래의 C 코드와 동일하다.
person_t *kukim = (person_t)malloc(sizeof(person_t));
- new Person()을 통해 객체를 만들 수 있다.
- 이는 사실 C에서 구조체 동적 할당과 동일하게 볼 수 있는데 new Person()는 Person()의 공간만큼 동적할당 하여 그것을 kukim에 대입한 것으로 볼 수 있다.
Variable(변수)
- JAVA에서 변수는 선언 위치에 따라 종류가 다르다.
- instance variable
- 생성 시기 : 객체 생성 시
- 클래스 영역에 선언되며, 클래스의 객체(인스턴스)를 생성할 때 만들어진다.
- class variable
- 생성 시기 : 클래스가 메모리 올라갔을 때
- static 키워드를 사용하여 정의한다.
- 모든 객체가 공통되게 사용한다. C에서 전역변수라 볼 수 있다.
- 모든 객체의 공통된 저장공간
- local variable
- 생성 시기 : 변수 선언문이 수행되었을 때
class Person {
// instance variable
int math;
int english;
int index;
int ages;
// class variable
static String school;
// Method
int sum() {
int bonus_score = 10; // local variable
return math + english + bonus_score;
}
}
Method(메서드)
// Method 선언과 구현
접근지정자 리턴타입 메서드이름(매개변수, ...) {
// code
return result;
}
class Person {
...
...
// instance Method, 인스턴스 변수를 사용하여 동작, 매개변수 필요 X
int sum() {
int bonus_score = 10; // local variable
return math + english + bonus_score;
}
// class Method, 인스턴스 변수와 상관없이 매개변수 만으로 동작 가능
static int sum2(int math, int english) {
int bonus_score = 10; // local variable
return math + english + bonus_score;
}
}
// 메서드도 마찬가지로 instance method와 class method가 있다.
생성자
- 클래스 정의 후 인스턴스화 과정을 통해 객체를 생성한다. 이때 객체를 초기화할 때 사용하는 것이 생성자이다.
- 기본 생성자
- 클래스 내부 생성자 없는 경우 컴파일러가 자동으로 추가해주는 생서자
- 묵시적 생성자 (명시적 생성자 선언되어있는 경우, 파라미터 없는 생성자를 만들고 싶다면 묵시적 생성자 선언을 꼭 해주어야 한다.)
- 파라미터 값이 없는 생성자
- 명시적 생성자
- 파라미터 값이 있는 생성자
this 키워드
- 클래스가 인서턴스화 되었을 때 자기 자신의 메모리 주소를 나타냄
- 클래스 내부의 변수와 메서드 파라미터를 구분할 때 사용한다.
- 위의 코드 중 명시적 생성자를 살펴보면 this.index = this를 볼 수 있는데 이는 인스턴스 변수와 메서드 파라미터의 변수를 구분하여 사용할 때 사용된다.
class Person {
// instance 변수 (멤버 변수)
int math;
int english;
int index;
int ages;
...
...
// constructor (생성자)
// 묵시적 생성자
public Person() {
}
// 명시적 생성자
public Person(int index) {
this.index = index;
this.ages = 8;
this.math = 0;
this.english = 0;
}
class Person {
// instance variable
int math;
int english;
int index;
int ages;
// class variable
static String school;
// instance Method
int sum() {
int bonus_score = 10; // local variable
return math + english + bonus_score;
}
// class Method
static int sum2(int math, int english) {
int bonus_score = 10; // local variable
return math + english + bonus_score;
}
public Person(int index) {
this.index = index;
this.ages = 8;
this.math = 0;
this.english = 0;
}
}
public class Main {
public static void main(String[] args) {
// Class Variable
Person.school = "xx초등학교";
System.out.println(Person.school);
// Class Method
System.out.println("점수 총합 : " + Person.sum2(30, 50));
// Instance
Person kukim = new Person(1);
// Instance Variable
kukim.math = 30;
kukim.english = 50;
// Instance Method
System.out.println("점수 총합 : " + kukim.sum());
System.out.println("sex : " + kukim.index);
System.out.println("생성자 ages : " + kukim.ages);
}
}
Reference 🌏
'☕️ JAVA' 카테고리의 다른 글
자바 객체의 메모리 크기는 얼마일까? (OOPs, Java Object Header, JOL 사용하기) 🤖 (2) | 2022.01.14 |
---|---|
📕 소프트웨어의 품질과 그 특성들 (0) | 2022.01.08 |
JAVA의 제어문 (0) | 2021.11.01 |
JAVA의 연산자 (0) | 2021.11.01 |
JAVA의 변수와 타입 (0) | 2021.11.01 |
댓글