JAVA 객체 지향 프로그래밍

객체 지향 프로그래밍

  • 컴퓨터 프로그래밍의 패러다임 중 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 “객체”들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다. 1
  • ‘객체’는 ‘속성’들과 ‘동작’들의 묶음이라고 할 수 있는데 속성은 ‘변수’로 나타내고, 동작은 ‘메소드(함수)’로 나타낸다.

    [ 1 ] : 위키백과

클래스

  • ‘클래스’는 객체들에 대한 설계도, 또는 설명서이다.
  • 객체는 속성과 기능을 가지고 있으며 속성은 변수로, 기능은 메소드(함수)로 표현할 수 있다.
1
2
3
4
5
6
public class Person {
String name;
int age;
int cashAmount;
BankAccount account;
}
1
2
3
4
public class BankAccount {
int balance;
Person owner;
}

메소드

  • 메소드는 클래스에 있는 함수이다.
  • 자바에서 모든 함수는 클래스에 있기 때문에 자바의 모든 함수는 메소드이다.
  • return값이 없으면 자료형 대신 void를 사용한다.
    • main 함수도 리턴 값이 없기 때문에 void를 사용한다.
1
2
3
int sum(int x, int y) {
return x + y;
}
1
2
3
public static void main(String[] args) {
System.out.println("Hello world!");
}

인스턴스

  • 클래스가 ‘설계도’라면 인스턴스는 그 설계도를 따른 ‘객체’ 를 뜻한다.
  • country라는 클래스가 있다면 ‘한국’, ‘미국’, ‘캐나다’ 등은 country 클래스를 따르는 인스턴스라고 할 수 있다. (혹은 그냥 country 인스턴스)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class BankDriver {
public static void main(String[] args) {
// 사람 생성
Person p1 = new Person();
p1.name = "엠제이";
p1.age = 30;
p1.cashAmount = 50000;

// 은행 계좌 생성
BankAccount a1 = new BankAccount();
a1.balance = 100000;

// 두 객체의 관계 설정
p1.account = a1;
a1.owner = p1;

// 테스트
System.out.print(p1.name + "의 계좌 잔액: " + p1.account.balance);
}
}

접근 제어자

  • 객체에 대한 권한을 너무 쉽게 주면 문제가 생길 수 있기 때문에 권한을 제한해주는 접근 제어자(Access Modifier) 가 존재한다.
  • 인스턴스 변수 앞에 private이라는 접근 제어자를 사용하면 그 변수는 해당 클래스 내에서만 접근 가능하다.
  • 해당 클래스 내에서 사용이 가능하기 때문에 그 클래스에 해당 변수를 사용하는 메소드를 쓰면 사용 가능하다.
  • setAge 같은 메소드를 setter, getAge 같은 메소드를 getter라고 칭한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Person {
private int age;

public void setAge(int newAge) {
if (newAge > 0) {
age = newAge;
}
}

public int getAge() {
return age;
}
}

메소드 오버로딩

  • 클래스 내에서 같은 이름의 메소드를 2개 이상 정의할 수 있게 해주는 기능.
  • 같은 이름의 메소드라도 파라미터 구성이 다르면 알아서 구분한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Calculator {
int add(int a, int b) {
return a + b;
}

int add(int a, int b, int c) {
return a + b + c;
}

double add(double a, double b) {
return a + b;
}

public static void main(String[] args) {
Calculator c = new Calculator();

System.out.println(c.add(2, 4)); // 6
System.out.println(c.add(2, 4, 8)); // 14
System.out.println(c.add(3.14, 2.54)); // 5.68
}
}

생성자

  • 인스턴스를 만들고, 인스턴스의 속성(인스턴스 변수)들을 초기화시킨다.
  • 생성자를 하나도 정의하지 않았을 경우 자동으로 기본 생성자를 제공한다.
    1
    Person p1 = new Person();
  • 생성자를 하나라도 정의하면 기본 생성자는 사용할 수 없다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Person {
    String name;
    int age;

    public Person(String pName, int pAge) {
    name = pName;
    age = pAge;
    }
    }
    1
    2
    3
    public static void main(String[] args) {
    Person p1 = new Person("엠제이", 27);
    }

오버로딩

  • 파라미터의 구성을 다르게 하면 생성자 오버로딩도 가능하다.
1
2
3
4
5
6
7
8
9
public Person(String pName, int pAge) {
name = pName;
age = pAge;
}

public Person(String pName) {
name = pName;
age = 12; // 12살을 기본 나이로 설정
}
1
2
3
4
5
6
7
8
9
public static void main(String[] args) {
Person p1 = new Person("엠제이", 27); // 첫 번째 생성자
Person p2 = new Person("mjaedot"); // 두 번째 생성자

System.out.println(p1.name); // 엠제이
System.out.println(p1.age); // 27
System.out.println(p2.name); // mjaedot
System.out.println(p2.age); // 12
}

this

  • 메소드에서 현재 인스턴스를 가리키는 역할.
1
2
3
4
5
6
7
8
9
10
11
class Person {
private String name;

public Person(String pName) {
name = pName;
}

public void sayHello() {
System.out.println("Hi. My name is " + this.name);
}
}
1
2
3
4
5
6
7
8
9
class Main {
public static void main(String[] args) {
Person p1 = new Person("엠제이");
p1.sayHello(); // Hi. My name is 엠제이.

Person p2 = new Person("mjaedot");
p2.sayHello(); // Hi. My name is mjaedot.
}
}

일반 메소드에서 사용

파라미터가 변수와 동일한 경우 클래스의 인스턴스 변수가 아닌 파라미터를 가리키게 된다. 인스턴스 변수 name보다 파라미터 변수 name이 더 가깝기 때문이다.

1
2
3
4
5
6
7
8
9
10
11
public class Person {
private String name;

...

public void setName(String name) {
name = name;
}

...
}

클래스로 생성된 인스턴스 변수 name을 가리키고 싶다면 this를 사용하면 된다.

1
2
3
4
5
6
7
8
9
10
11
public class Person {
private String name;

...

public void setName(String name) {
name = name;
}

...
}

생성자에서의 사용

생성자에서도 동일하게 적용 가능하다.


REFERENCE
코드잇 온라인 강의 자바 기초

  • © 2020-2025 404 Not Found
  • Powered by Hexo Theme Ayer