tuter77

Java : 객체, 함수, 메서드 본문

JavaStudy

Java : 객체, 함수, 메서드

tuter77 2023. 1. 29. 19:31

금일 부터 자바 객체지향 입문강의에 들어섰다.

앞서 배운 자료형, 연산자, 반복문등을 토대로 객체란 무엇인지, 함수, 메서드, 메모리 저장 방식 등에 대해 자세히 배울 예정이다.

 

● 객체

객체는 의사나 행위가 미치는 대상이라고 이론적으로 설명하는데, 구체적/추상적인 데이터의 단위이다.

예로 보면 좀 더 쉽다.

예제) 학생, 회원, 생산 등

 

예제에서 보듯 학생이나 회원과 같이 현실에 존재하는 객체도 객체로서 프로그래밍이 가능하지만, 생산과 같이 어떠한 동작을 나타내는 것도 객체로써 프로그래밍을 할 수 있다.

 

이러한 객체 지향 프로그래밍을 이해하기위해선 절차지향 프로그래밍을 먼저 살펴봐야한다. 

 

▷ 절차지향 프로그래밍 

 

예시로 바로 알아보자

아침에 일어나서 학교에 가는 과정을 절차지향으로 프로그래밍한다면, 

 

일어난다 > 씻는다 > 밥먹는다 > 버스를 탄다 > 요금을 지불한다 > 학교에 도착한다.

 

이처럼 시간순서에 따라 프로그래밍 하게된다.

대표적으로 C언어가 있다.

 

▷ 객체지향 프로그래밍 

 

반면 객체 지향 프로그래밍에선 각 행동의 주체와 대상들을 객체화 한다.

 

학생    ↔    밥

  ↕    ↘     

버스          학교

 

위와 같이 학생, 밥, 버스, 학교 들을 모두 객체화해서 서로 관계를 맺는다. 

이를테면 학생은 버스에 타고 버스는 학생을 태운다. 

학생은 밥을 먹고 밥은 학생에겍 먹힌다.

학생은 학교에 가고 학교는 학생을 수용한다.

 

이러한 각 객체간의 관계를 Interaction이라고 하고 이는 아래와 같이 구현할 수 있다.

1. 객체를 정의(property)

2. 각 객체가 제공하는 기능들을 구현(function, method)

3. 각 객체가 제공하는 기능들 간의 소통(메시지 등)을 통하여 객체간의 협력 구현.

 

객체지향 프로그래밍에선 이와 같이 프로그래밍 할 수 있다.

 

▷객체 찾기

객체는 앞서 알아본 것 처럼 특정한 상황에 따라 찾아볼 수 있다.

간단한 예시로 찾아보면 온라인 쇼핑몰에서 물건을 구매하는 과정에는 온라인 쇼핑몰(시스템), 회원(로그인), 판매자(판매), 상품(주문하기) 와 같은 객체(행위)를 찾아볼 수 있다.

 

이러한 객체들은 Class 라는 파일로 구현된다.

예제를 보기에 앞서 클래스의 개념을 잠깐 보면 클래스는 객체를 추상화하여 코딩하는 것이다. 

객체의 속성은 클래스의 멤버 변수로 선언된다.(멤버변수는 앞 과정에서 본 블럭안에서 정의되는 지역변수이다.)

 

예시로 보겠다. 학생클래슬를 생성한다고 할때, 

 

public class Student {

      int studentNumber;

      String studentName;

      int majorCode;

      String majorName;

      int grade;

}

위와 같이 각 멤버변수들을 선언하는걸 볼 수 있다. 

이렇게 선언된 멤버변수들은 후에 함수/메서드에서 사용된다.

객체 정의 > 각 객체의 속성을 멤버변수로 , 역할을 메서드로 구현. > 각 객체간의 협력을 구현

 

▷ public의 의미 

public은 공용으로 어디서든 이 객체들에 접근할 수 있다는 접근 제어자 이다.

 

 함수

하나의 기능을 구현하는 일련의 코드이다.

구현된(정의된) 함수는 호출하여 사용하고 호출된 함수는 기능이 끝나면 제어가 반환된다.(호출해서 사용하는 다른 클래스 혹은 함수가 존재)

함수로 구현된 하나의 기능은 여러곳에서 동시에 호출되어 사용이 가능하다.

예로보면 더하기 함수는 숫자 더하기, 성적 더하기, 거리 더하기 등 여러곳에서 호출되어 동시에 사용가능하다.

앞선 얘기지만 메소드는 함수의 일종으로 Class에 속해있다.

 

▷함수 정의하기 

이름, 매개변수, 반환값, 함수 몸체로 구성된다.

(반환이 없는 함수는 void를 사용하여 작성한다.)

 

아래는 함수정의의 예시이다.

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;

int i;

 

for(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);

 

sayHello("안녕하세요");

 

total = calcSum();

System.out.println(total);

}

 

위의 예시에서 보면, 세 가지 종류의 함수가 존재하는데 하나는 매개변수가 있고 반환값이 없는 경우, 매개변수와 반환값 두개가 존재하는 경우, 세번째는 매개변수가 없고 반환값만 있는 경우이다.

마지막 main함수는 위의 세가지 함수를 호출하여 사용하는 함수다. 

아래 main함수에서 볼 수 있듯, 각 함수들은 함수명을 이용하여 호출할 수 있고, 그 안의 매개변수를 통해 기능을 사용하거나(n1, n2, 함수에서 선언된 String greetin = 안녕하세요) 매개변수 없이 반환값만 호출하여 사용할 수 도있다.

 

▷ 함수 호출 스택과 메모리

 

이렇듯 함수를 호출하면, 스택이라는 곳에 메모리가 저장되는데 이 스택메모리들은 함수 사용동안 저장하고 기능이 끝나면 반환된다.(기능끝나면 없어짐)스택의 정확한 정의는 함수가 호출될 때 지역변수(매개변수)들이 사용하는 메모리이다.

 

예시를 통해 알아보겠다.

 

int total = addNum(n1, n2)로 함수를 호출하게 되는경우,

 

| n1, n2 |

| result  |      > addNum()함수가 사용될 메모리공간이 스탱에 생성된 모습.(함수 사용후 반환됨.) 

ㅡㅡㅡㅡ

| n1, n2 |

|   sum  |      > 아래는 main()함수가 사용할 메모리 공간이 스택에 생성된 모습.

ㅡㅡㅡㅡ

 

위 모습처럼 스택에서는 밑에서 부터 메모리공간을 생성해 쌓아나간다. 함수를 사용하고 난후 스택의 메모리공간은 지워진다. (첨언 앞으로 배울 내용중에 Heap 메모리가 있는데, 이곳에는 실질적인 property들이 저장되는 곳이다. stack 은 Heap 메모리에 저장된 자료의 주소(?)를 갖고있다고 한다.)

 

▷ 메서드 (Method)

 

java 예제 들을 살펴보며 가장 많이 본 단어이다. 메서드는 함수의 일종으로 클래스에 속해있는 함수다. 즉, 객체의 기능을 구현하기 위해 클래스 내부에 구현되는 함수라고 할 수 있다.(C++에서는 멤버함수라고도 한다. 멤버변수와 유사하게..)메서드를 구현함으로서 객체의 기능이 구현된다. 앞서 살펴본 객체지향 프로그래밍 순서중 기능 구현이다.메서드의 이름은 그 객체를 사용하는 객체(클라이언트)에 맞게 짓는것이 좋다고한다.(예. getStudentName 객체인 student 위주로 지어진 메서드명.)

 

예제를 통해 살펴보겠다.

public class Student {//클래스만듦

 

public int studentID; //속성선언

public String studentName;//속성선언

public String address;//속성선언

 

public void showStudentInfo() {//메서드 만듦

System.out.println(studentID + "학번 학생의 이름은 " + studentName + "이고, 주소는 " + address + "입니다.");

 

}

 

public String getStudentName() {//메서드 만듦

return studentName;

}

 

public void setStudentName(String name) {//메서드 만듦

studentName = name;

}

}

 위와 같이 클래스를 만들어 각 속성(property)를 부여하면 아래에 메서드를 만들어 놓는다. 그리고 이렇게 만들어진 메서드는, 

public class StudentTest {

//student클래스를 테스트하기 위한 클래스

public static void main(String[] args) {

Student studentLee = new Student();//클래스의 크기가 정해져있지 않아서 그대로 클래스명 사용, studentLee는 변수명, new는 생성자 호출, 스튜던트 하나를 생성해라는 의미

 

studentLee.studentID = 12345;

studentLee.setStudentName("Lee");

studentLee.address = "서울 강남구";

 

studentLee.showStudentInfo();

 

Student studentKim = new Student();

 

studentKim.studentID = 54321;

studentKim.studentName = "Kim";

studentKim.address = "서울 강북구";

 

studentKim.showStudentInfo();

//studentLee등은 참조변수이다.

}

}

이와 같이 다른 클래스에서도 호출하여 사용할 수 있다. 해당 ClassName(student) 만 입력하면 자동으로 메서드가 나온다.(자바에서 제공되는 메서드 포함)

끝으로 이렇게 클래스를 기반으로 new생성자로 만드는 객체는 인스턴스라고 부른다.

 

오늘 드디어 method까지 진도가 진행되어 기분이 좋다. 기본적인 개념들을 반복적으로 익혀 앞으론 헷갈리지 않게 해야겠다.

 

위 내용은 2022.12.21에 공부한 내용입니다.

링크 : https://dudwls3278.tistory.com/20