자바는 객체지향 프로그래밍 언어이다. 객체지향과 항상 비교하는 것이 절차지향인데 각각의 핵심은 무엇이고, 장단점으로 무엇이 있는지 공부했다.

 

절차지향 프로그래밍

  • 실행 순서를 중요하게 여김
  • “어떻게”를 중심으로 프로그래밍 할지 중점
  • 데이터와 관련 메서드 분리

 

객체지향 프로그래밍

  • 객체를 중요하게 여김
  • “무엇을” 중심으로 프로그래밍 할지 중점
  • 데이터와 관련 메서드 한 곳에 있음 = 캡슐화
    • 캡슐화의 이점
      • 객체지향 프로그래밍을 하면 하나의 객체의 상태와 행동을 필드와 메서드로 다 표현할 수 있고, 사람이 이해하기 더 쉬워진다. 따라서 코드 가독성이 증가하고, 속성과 기능이 한 곳에 있기 때문에 변경도 더 쉬워진다.

 

둘의 중요한 차이

절차지향 프로그래밍과 객체지향 프로그래밍의 가장 큰 차이점은 데이터와 메서드의 분리 여부이다. 절차 지향은 데이터와 해당 데이터 관련 메서드가 분리되어있다. 반면 객체 지향은 데이터와 해당 데이터 관련 메서드가 하나의 객체 안에 포함되어 있다.

절차 지향은 순서를 어떻게 설계할 지를 고민해야 했다면, 객체 지향은 객체를 어떻게 설계하지에 더 초점이 맞춰져있다고 이해하면 된다.

 

절차지향 ↔ 객체지향 ?

Nope. 절차 지향과 객체 지향은 서로 대치되는 개념이 아니다. 객체 지향이라도 프로그램의 작동 순서는 중요하다. 다만, 순서와 객체 둘 중 어디에 더 초점을 맞추는지가 차이점이다.

 

 

Reference

인프런 '김영한의 실전 자바 - 기본편'

'Dev Language > Java' 카테고리의 다른 글

[자바/기본] 5. 패키지  (0) 2024.01.04
[자바/기본] 4. 생성자  (0) 2024.01.04
[자바/기본] 2. 기본형과 참조형  (0) 2024.01.04
[자바/기본] 1. 클래스와 데이터  (4) 2024.01.04
[자바/입문] 8. 메서드  (2) 2023.12.29

김영한님 왈 : 자바에서 기본형과 참조형을 이해하는 것은 정말 중요하다.

자바 대원칙 one more time : 항상 변수의 값을 복사해서 대입한다

 

기본형

  • int, long, double, boolean
  • 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입
  • 자바에서 기본 제공
  • 기본형은 바로 계산 가능

 

참조형

  • Student student1, int[] students → 클래스와 배열을 다루는 변수
  • 데이터에 접근하기 위한 참조값(주소값)을 저장하는 데이터 타입
  • 참조형은 바로 계산 불가능
  • 객체는 .(dot)을 통해 메모리 상에 생성된 객체를 찾아가야 사용할 수 있다

 

기본형과 참조형 비교

기본형은 값을 변경해도 영향을 주지 않지만, 참조형은 변수가 참조값을 가지고 있기 때문에 각 변수간 영향을 줄 수 있다. 이게 무슨 말이냐면

  • 기본형

int a = 10;
int b = a;
int a = 20; 
인 경우, a = 20, b = 10이다. 
왜냐하면 a, b는 모두 기본형인 int 타입이고 자바는 값을 복사해서 대입하기 때문이다.
  • 참조형

변수와 초기화

  • 변수의 종류
    • 멤버 변수
      • 클래스에 선언된 변수
      • 자동 초기화 된다(int = 0, boolean = false, 참조형 = null)
    • 지역 변수
      • 메서드에 선언된 변수, 매개변수(파라미터)도 지역변수의 한 종류
      • 직접 수동으로 초기화 해야한다

 

null

값이 존재하지 않는 상태를 의미한다. 참조가 null이라면 객체를 찾아야하는 주소가 없는 것이다. 참조가 null인 인스턴스는 사용되지 않고 메모리 용량만 차지된다. 그렇기에 자바의 GC가 이를 찾아 제거함으로써 메모리 관리를 한다. 참조형 변수에만 null 할당 가능하다.

  • NullPointerException
    • 주소가 없는 곳을 찾아갈 때 발생하는 예외
    • 예시 : null.name인 경우에 발생한다

 

Reference

인프런 '김영한의 실전 자바 - 기본편'

'Dev Language > Java' 카테고리의 다른 글

[자바/기본] 4. 생성자  (0) 2024.01.04
[자바/기본] 3. 객체지향 프로그래밍  (0) 2024.01.04
[자바/기본] 1. 클래스와 데이터  (4) 2024.01.04
[자바/입문] 8. 메서드  (2) 2023.12.29
[자바/입문] 7. 배열  (0) 2023.12.29

 

아래 코드를 보면서 클래스가 왜 필요한지에 대해 생각해보자.

package class1;
public class ClassStart1 {
	public static void main(String[] args) {
		String student1Name = "학생1"; 
		int student1Age = 15;
		int student1Grade = 90;

		String student2Name = "학생2"; 
		int student2Age = 16;
		int student2Grade = 80;

		System.out.println("이름:" + student1Name + " 나이:" + student1Age + " 성 적:" + student1Grade);
		System.out.println("이름:" + student2Name + " 나이:" + student2Age + " 성 적:" + student2Grade);
	} 
}

위 코드는 학생 두 명의 정보를 입력하고 출력하는 코드이다. 여기서 이름, 나이, 성적을 입력하는 것이 중복되어서 보기 좋지 않다. 이를 배열로 묶어서 진행해도 되지만, 학생의 정보를 수정하거나 삭제할 경우 잘못 작업할 가능성이 있기 때문에 그리 좋은 방법은 아니다. 그렇다면 아래와 같은 질문을 하게 된다.

 

학생 정보에 대한 중복 코드를 수정/삭제 걱정 없이 편하게 만들 수 있는 방법은 없을까?

이것의 해답은 학생이라는 개념을 만들고, 학생의 이름, 나이, 성적을 모두 하나로 묶는 것이다. 이렇게 하나로 묶는 것을 클래스라는 개념을 통해 만들 수 있다.

 

클래스란?

자바에서의 int, String과 같은 타입 뿐만 아니라 사용자가 원하는 타입을 만들 수 있다. 이때 사용자가 원하는 타입을 만들기 위한 설계도 혹은 틀을 클래스라고 한다. 클래스에서 정의한 변수는 멤버 변수 혹은 필드라고 정의한다.

클래스를 통해 객체와 인스턴스를 만들 수 있는데, 실무에서는 둘 다 같은 의미로 혼용해서 사용한다.

 

  • 변수 선언 및 클래스 객체 메모리에 생성
Student student1; // student1 변수 선언
student1 = new Student(); // Student 객체 메모리에 생성 후 참조값 반환 & 참조값 student1 변수에 대입

 1. 참조값을 변수에 저장하는 이유

→ 실제 참조값을 가진 변수를 출력하면 객체가 저장된 메모리 주소가 담긴 문자열이 출력된다. 예시) class1.Student@7a81197d

2. new Student()는 메모리에 객체를 생성했지만, 이 자체로는 접근할 수 없다. 그래서 해당 주소값(참조값)을 student1이라는 변수에 저장해 객체에 접근가능하다.

 

객체란?

클래스에서 정의한 속성기능을 가진 실체이다. 같은 타입이라도, 각각의 객체는 서로 독립적인 상태를 가진다.

// 아래 두 Student의 객체 student1, student2는 다른 객체이다. 
Student student1 = new Student();
Student student2 = new Student();

 

인스턴스란?

특정 클래스로부터 생성된 객체를 의미한다. ‘특정 클래스로부터 생성되었다’라는 관계를 의미한다. 예시로, student1 객체는 Student 클래스의 인스턴스이다(Student 클래스로 생성되었으므로).

 

Remind

자바 대원칙 : 자바에서 대입은 항상 변수에 들어있는 값을 복사한다.

그래서 new Student[]{student1, student2}; 처럼 student1, student2로 배열을 만들어도 student1 인스턴스가 아닌 student1의 참조값이 배열에 저장된다.

 

 

Reference

인프런 '김영한의 실전 자바 - 기본편'

메서드

메서드 = 함수 = 블랙박스

→ 필요한 값만 입력하면 결과를 얻을 수 있다

→ 메서드를 호출하는 곳에서는 메서드 선언은 알지만, 메서드 본문은 모른다.

 

메서드 목적

같은 코드를 여러번 반복해서 작성하지 않게 해 줌

재사용(같은 함수를 다른 입력 값으로 여러번 호출 가능)

메서드로 정리하면 전체 코드 구조를 한 눈에 볼 수 있다.

변경 사항이 발생하면 관련된 메서드만 수정하면 되기에(수정 범위가 메서드로 한정됨) 유지보수하기 좋다.

메서드를 적절하게 사용해 분류하면 구조적으로 읽기 쉽고, 유지보수 하기 좋은 코드를 만들 수 있다.

 

메서드 사용의 장점

  • 코드 재사용: 메서드는 특정 기능을 캡슐화하므로, 필요할 때마다 그 기능을 다시 작성할 필요 없이 해당 메서드를 호출함으로써 코드를 재사용할 수 있다.
  • 코드의 가독성: 이름이 부여된 메서드는 코드가 수행하는 작업을 명확하게 나타내므로, 코드를 읽는 사람에게 추가적인 문맥을 제공한다.
  • 모듈성: 큰 프로그램을 작은, 관리 가능한 부분으로 나눌 수 있다. 이는 코드의 가독성을 향상시키고 디버깅을 쉽게 만든다.
  • 코드 유지 관리: 메서드를 사용하면, 코드의 특정 부분에서 문제가 발생하거나 업데이트가 필요한 경우 해당 메서드만 수정하면 된다. 이렇게 하면 전체 코드 베이스에 영향을 주지 않고 변경 사항을 적용할 수 있다.
  • 재사용성과 확장성: 잘 설계된 메서드는 다른 프로그램이나 프로젝트에서도 재사용할 수 있으며, 새로운 기능을 추가하거나 기존 기능을 확장하는 데 유용하다.
  • 추상화: 메서드를 사용하는 곳에서는 메서드의 구현을 몰라도 된다. 프로그램의 다른 부분에서는 복잡한 내부 작업에 대해 알 필요 없이 메서드를 사용할 수 있다.
  • 테스트와 디버깅 용이성: 개별 메서드는 독립적으로 테스트하고 디버그할 수 있다. 이는 코드의 문제를 신속하게 찾고 수정하는 데 도움이 된다.

 

메서드 호출

  • 메서드 이름에 입력값을 전달하면 됨
  • int sum1 = add(5, 10); // 실행 순서 // 1. add 호출 2. 반환값 있으면 반환 3. 반환값 sum1에 저장
  • 메서드 호출 용어
    • 인수(argument) : 함수 호출 시 함수 안에 넘기는 값
    • 매개변수(parameter) : 메서드를 정의할 때 선언한 변수

 

메서드 정의

public static int add (int a, int b) {
	// 메서드 본문, 실행 코드 
}

[제어자] [반환타입] [메서드 이름](매개변수 목록) {
	메서드 본문
}

 

return

함수는 return 문을 만나면 그즉시 메서드를 빠져나간다.

 

자바 대원칙

자바는 항상 변수의 값을 복사해서 대입한다

public static void main(String[] args) {
		int num1 = 5;
		int num2 = num1; // num1을 num2에 넣는 것이 아니라, num1의 값을 복사해서 num2에 넣는다.
		num2 = 10;
		System.out.println("num1=" + num1);
		System.out.println("num2=" + num2);
}

그렇기에 각각의 메서드 안에서 사용하는 변수는 서로 완전히 분리된 다른 변수이다. 같은 이름의 변수가 있다면 우연일 뿐, 서로 영향을 주지 않는다.

 

  • 예시 코드
    • main()에서의 number와 changeNumber()의 number는 무관하다
    package method;
    
    public class MethodValue2 {
    
        public static void main(String[] args) {
            int number = 5;
            System.out.println("1. changeNumber 호출 전, num1 : " + number);
            changeNumber(number);
            System.out.println("4. changeNumber 호출 후, num2 : " + number);
        }
    
        public static void changeNumber(int number) {
            System.out.println("2. changeNumber 변경 전, num2 : " + number);
            number *= 2;
            System.out.println("3. changeNumber 변경 후, num2 : " + number);
        }
    }
    

 

자동 형변환

자동 형변환은 크기가 작은 타입 → 크기가 큰 타입에서만 가능하다 (int < long < double)

메서드를 호출할 때, 매개변수에 값을 전달하는 것도 결국 변수에 값을 대입하는 것

메서드를 호출할 때는 전달하는 인수의 타입과 매개변수의 타입이 동일해야 전달이 된다. 단, 타입이 달라도 자동 형변환이 가능한 경우에는 호출 할 수 있다.

 

메서드 시그니처(method signature)

메서드 시그니처는 자바에서 메서드를 구분할 수 있는 고유한 식별자나 서명을 의미한다.

메서드 시그니처 = 메서드 이름 + 매개변수 타입/순서

// 매개변수 이름은 상관없다. 

함수 호출 시 최대한 동일한 메서드 시그니처를 찾는다. 만약 없는 경우는 자동 형변환까지 고려해 동일한 이름에 파라미터 자동 형변환 되는 함수를 호출하기도 한다. (되도록이면 동일한 메서드 시그니처인게 좋다)

 

Reference

인프런 '김영한의 실전 자바 - 기본편'

 

+ Recent posts