728x90

객체

  • 기능을 수행하는 데이터의 단위

 

객체 지향 프로그래밍 vs 절차 지향 프로그래밍

  • 객체 지향 프로그래밍
    • 객체 간의 관계가 존재
    • 객체의 속성, 기능, 협력 구현 필요
    • 존재하는 것을 추상화한 뒤 코드화를 진행
    • 대표 언어 : C++, java
  • 절차 지향 프로그래밍
    • 시간의 흐름에 따른 프로그래밍
    • 컴퓨터의 작업 처리 방식과 유사
    • 컴퓨터의 처리구조와 유사해 실행속도가 빠름
    • 대표 언어 : C

⭐️ 객체 지향의 반대가 절차 지향, 절차 지향의 반대가 객체 지향은 아니다!

Ref.

 

절차지향 VS 객체지향

절차지향(Procedural Programming)이란? 절차지향 프로그래밍이란 물이 위에서 아래로 흐르는 것처럼 순차적인 처리가 중요시 되며 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법

brownbears.tistory.com

 


함수

public class FunctionTest {
    public static int addNum(int num1, int num2) {
        int result;
        result = num1 + num2;
        return result;
    }
    public static void sayHello(String greeting) {
        System.out.println(greeting);
    }
    public static int calcSum() {
        int sum = 0;
        for(int i = 0; i <= 100; i++){
            sum += i;
        }
        return sum;
    }
    public static void main(String[] args) {
        int n1 = 10;
        int n2 = 20;
        int total = addNum(n1, n2);
        System.out.println(total);
    }

}

 

함수 호출과 스택 메모리

  • 프로그램은 함수 호출시, 콜 스택의 개념을 이용한다.
  • 함수를 모두 사용한 뒤에는 해당 공간이 해제된다.
  • 스택에 저장되는 것들
    • 지역 변수
    • 매개변수(Arguments)
    • 호출한 함수(caller)의 스택에 대한 정보
    • 반환값 주소(return address)

Ref.

 

[기본개념] 콜 스택(Call Stack) 꿀이해

콜 스택(Call Stack) 개념정리 Overview 콜 스택(call stack)은 프로그램이 함수 호출(Function call)을 추적할 때 사용하는 것이다. 콜 스택은 각 function call 당 하나씩의 스택들로 이루어져 있다. 예를 들어,

ssminji.github.io

 

함수 vs 메서드

  • 함수
    • 단독 모듈
    • 호출해서 사용
  • 메서드
    • 클래스 내부에 구현
    • 클래스 멤버 변수를 사용해서 구현
    • ⭐️ 메서드 명명은 그 객체를 호출하는 객체(클라이언트)에 맞게 명명하는 것이 좋다!

 


객체 생성

  • 객체의 속성은 멤버 변수로, 객체의 기능은 메서드로 구현한다.
  • 클래스를 기반으로 생성되는 새로운 객체 : 인스턴스
  • 여러개의 인스턴스가 생성된다.

 

인스턴스 생성과 힙 메모리

  • 인스턴스
    • 객체의 속성을 정의한 클래스에 대한 기능을 구현한 객체
  • 힙 메모리
    • C의 malloc, C++의 new를 통해 생성된 공간과 동일
    • C와 C++은 수동으로 해제시켜줘야함
      • java는 gabage collector가 자동 수행
    • 필요할 때 동적으로 할당하는 메모리
  • 인스턴스(생성자)는 힙 메모리에 생성된다.

 


생성자

  • 필요에 따라서 생성자를 구현
  • 구현하지 않을 경우 컴파일러에 의한 디폴트 생성자 생성
  • 보통 객체 생성시, 변수나 상수 초기화를 위해 사용
  • 디폴트 생성자의 생성은 필요 여하에 따라 결정

 

| Student.java

public class Student {
    public int studentNumber;
    public String studentName;
    public int grade;

    public Student() {}

    public Student(int studentNumber, String studentName, int grade) {
        this.studentNumber = studentNumber;
        this.studentName = studentName;
        this.grade = grade;

    }

    public String showStudentInfo() {
        return studentName + "학생의 학번은 " + studentNumber + "이고, "+ grade +"학년 입니다.";
    }
}

 

| StudentTest.java

public class StudentTest {
    public static void main(String[] args) {
        Student studentLee = new Student();

        System.out.println(studentLee.showStudentInfo());

        Student studentKim = new Student(123456, "Kim", 3);
        System.out.println(studentKim.showStudentInfo());
    }
}

 


접근 제어 지시자(access modifier)

  • private : 동일 클래스
  • default : 동일 패키지
  • protected : 동일 패키지, 상속 관계
  • public : 어디서나

 


get(), set() 메서드

  • private 로 선언된 멤버 변수에 접근하여 수정할 수 있는 public으로 제공
  • get() 메서드만 제공되는 경우는 read-only 필드이다.

 

  • private 로 지정하는 이유 : 외부에서 접근 가능한 정보를 최소한으로 오픈함으로써 객체의 오류를 방지하고 클라이언트 객체가 더 효율적으로 객체를 활용할 수 있도록 해준다.

 


캡슐화(encapsulation)

  • 대부분의 멤버 변수와 메서드를 감추고 외부에 통합된 인터페이스만은 제공하여 일관된 기능을 구현 하게 한다.
  • 각각의 메서드나 멤버 변수를 접근함으로써 발생하는 오류를 최소화 한다.

 

| MakeReport.java

public class MakeReport {

    StringBuffer buffer = new StringBuffer();

    private String line = "===========================================\n";
    private String title = "  이름\t   주소 \t\t  전화번호  \n";
    private void makeHeader()
    {
        buffer.append(line);
        buffer.append(title);
        buffer.append(line);
    }

    private void generateBody()
    {
        buffer.append("James \t");
        buffer.append("Seoul Korea \t");
        buffer.append("010-2222-3333\n");

        buffer.append("Tomas \t");
        buffer.append("NewYork US \t");
        buffer.append("010-7777-0987\n");
    }

    private void makeFooter()
    {

        buffer.append(line);
    }

    public String getReport()
    {
        makeHeader();
        generateBody();
        makeFooter();
        return buffer.toString();
    }
}

 

| MakeReportTest.java

public class MakeReportTest {
    public static void main(String[] args){
        MakeReport builder = new MakeReport();
        String report = builder.getReport();

        System.out.println(report);
    }
}
  • StringBuffer, StringBuilder 로 String 값을 연결한다.
  • 보통 객체 배열을 for을 돌리면서 값을 반복적으로 꺼내오면서 사용

 


this

  • 인스턴스 자신의 메모리를 가짐
  • 생성자에서 다른 생성자를 호출 할때 사용
    • 생성자를 호출해서 멤버 변수 세팅
    • 보통 파라미터가 적은 생성자에서 파라미터가 많은 생성자를 호출할 때 사용
    • 생성자에서 this를 이용해서 다른 생성자를 호출하는 경우, 인스턴스의 생성이 완전하지 않은 상태이므로 this() statement 이전에 다른 statement를 쓸 수 없음
  • 자신의 주소값 반환
public class Person {
    String name;
    int age;

    public Person(){
        // int num = 10;
        // name = "test"; Error !
        this("no name", 1); // 다른 생성자 호출
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person showPerson(){
        System.out.println(name+ ", "+age);
        return this; // this 자체를 반환하면 주소값이 반환됨
    }

    public static void main(String[] args){
        Person person = new Person();
        System.out.println(person.showPerson());
    }
}

 

 
728x90

'🧑‍💻 Language > Java' 카테고리의 다른 글

[Java] 객체 지향 프로그래밍(3)  (0) 2022.04.26
[Java] 객체 지향 프로그래밍(2)  (0) 2022.04.19
[Java] Basic Java (2)  (0) 2022.04.04
[Java] Basic Java (1)  (0) 2022.03.29
[Java] 멀티스레드  (0) 2021.10.18