본문 바로가기
전공 수업/객체 지향 프로그래밍(Java)

[9주 차] - 메서드의 개념, 클래스와 객체

by TwoJun 2022. 11. 4.

    과목명 : 객체지향 프로그래밍(Object oriented programming)

수업일자 : 2022년 10월 26일 (수)

 

 

 

1. 메서드의 기본적인 개념

1-1. 메서드(Method)

- 메서드란, 객체 지향 프로그래밍(Object Oriented Programming, OOP)에서 객체와 관련된 서브루틴이자 클래스가 가지고 있는 기능을 의미하고 있습니다. 클래스 기반 언어에서는 클래스 내부에서 정의됩니다.

 

 

(1) 함수(Function)

- 하나의 특정한 기능을 수행하기 위해 설계된 코드들의 집합을 의미하며 일정한 입력값을 통해 출력값을 반환할 수도 있지만 반환값이 없고 특정 기능만을 수행할 수도 있습니다.

 

(2) 프로시저(Procedure)

- 특정한 기능, 로직을 처리하지만 반환값이 존재하지 않는 코드입니다. 일부 언어에선 함수와 프로시저를 통칭해서 부르기도 합니다.

 

(3) 루틴(Routine), 서브루틴(Subroutine)

- 루틴은 프로그램의 일부로써 반복적으로 사용되는 특정한 기능, 연산을 수행하기 위한 명령의 집합이며, 서브루틴은 이러한 루틴 내부에서 또 다른 루틴이 존재할 경우 해당 루틴을 서브루틴이라고 합니다.

 

(4) 공통점

- 프로그램 내부에서 특정한 기능을 수행하기 위한 코드들의 집합이라는 속성을 가지게 됩니다.

 

 

 

 

 

1-2. 메서드(Method)를 정의하여 호출하기

- Java에서 클래스 내부에 정의된 함수는 메서드(Method)라는 이름을 갖게 됩니다.

- 다른 언어에선 함수, 서브루틴 등 다양한 명칭으로 표현합니다.

 

- 아래와 같이 메서드를 정의할 수 있습니다.

// 두 정수를 파라미터로 받아서 더한 후 더한 값을 리턴하는 numberAdd 메서드
int numberAdd(int a, int b) {
    int result = a + b;
    return result;
}

 

 

- 정의한 메서드를 Main 메서드에서 호출하여 사용할 수 있습니다.

class AddFunction {

    // numberAdd 함수 정의
    static int numberAdd(int a, int b) {
        return a + b;
    }
    
    public static void main(String[] args) {
    
    // numberAdd 함수 호출
    System.out.println(numberAdd(10, 20));     //30
    }
}

 

 

 

 

1-2. 메서드 호출(Call)하기

- 정의된 메서드를 호출하여 사용할 수 있습니다.

- 문법 : 메서드명();

- 문법 : 메서드명(전달인자1, 전달인자2, ... 전달인자 n);

// 메서드를 호출하며 전달인자로 정수형 데이터를 넘긴다.
addNumber(100, 200);

 

 

 

 

1-3. 메서드를 호출하여 특정 작업 후 리턴값을 변수에 저장할 수 있습니다.

// 리턴값을 저장할 result 변수 선언
int result = 0;

// 리턴값을 특정 변수에 저장
result = addNumber(100, 200);

// 변수에 저장된 값을 출력
System.out.println(result);      // 300

 

 

 

 

1-4. 함수 호출 시 전달하는 인자(Argument)의 형태를 변수의 형태로 전달할 수 있습니다.

class ArguVariable {
    static int addNumber(int a, int b) {
        return a + b;
    }
    
public static void main(String[] args) {
    int firstNumber = 10;
    int secondNumber = 20;
    
    int result = addNumber(firstNumber, secondNumber);
    
    System.out.println(result);     // 30
    }
}

 

 

 

 

 

 

2. 클래스와 객체

2-1. 소스코드의 형태

- Java의 소스코드 형태는 클래스를 위한 코드 블록과 메서드를 위한 코드 블록으로 구성됩니다.

 

 

 

2-2. 변수에 접근 가능한 범위

- 클래스 내부에 선언한 변수는 동일 클래스 내부의 메서드에서 접근할 수 있습니다.

- 메서드 내부에 선언한 변수는 다른 메서드에서 접근할 수 없습니다.

 

 

 

2-3. 클래스(Class), 객체(Object), 인스턴스(Instance)의 뜻

(1) 클래스(Class) 

- 클래스란, 객체를 정의할 수 있는 설계도와 같은 의미로 사용됩니다. Java에서는 객체를 생성할 수 있는 설계도인 클래스를 가지고 여러 객체를 생성하여 사용할 수 있습니다.

 

 

 

(2) 객체(Object)

- 클래스의 인스턴스라고도 부르며 실제 소프트웨어 세계에 구현할 대상이며 인스턴스를 포함하는 일반적인 의미입니다.

 

- 객체란, 물리적으로 존재하거나 추상적으로 생각할 수 있는 것들 중에서 식별 가능한 것을 말합니다.

 

- 실제로 존재하는 것, 사물 또는 개념이 될 수 있습니다.

 

- 주위에 물리적으로 존재하는 책상, 컴퓨터, 노트북 등 모두 객체가 될 수 있습니다.

 

 

 

(3) 인스턴스(Instance)

- 객체를 생성할 수 있는 설계도를 가지고 실제 소프트웨어 세계에 구현된 실체를 의미합니다.

 

- 이렇게 객체가 실체화된 인스턴스는 메모리에 적재되어 실행될 수 있는 상태입니다.

 

- 인스턴스는 객체에 포함되는 개념입니다. 

 

 

 

 

 

 

2-4. 새로운 클래스를 정의하고 메서드 추가하기

// 사람이라는 새로운 클래스 생성
class Person {
    // 사람의 이름에 대한 문자열 변수
    String personName;
    
    // 걷는 동작에 대한 메서드
    public void walk(int speed) {
        System.out.printf("사람이 %dkm 속도로 걸어갑니다%n", speed);
    }
    
    public void run(int speed) {
        System.out.printf("사람이 %dkm 속도로 뛰어갑니다.%n", speed);
    }
}

 

 

 

 

 

 

2-5. 객체지향에서 클래스, 객체의 주요 특징 

(1) 클래스는 변수와 메서드를 함께 가질 수 있습니다.

 

(2) 만들어진 클래스는 new 연산자를 통해 객체를 생성할 수 있습니다.

 

(3) 만들어진 객체의 멤버(변수, 메서드)에 접근하고 싶다면 .을 이용하여 접근할 수 있습니다.

- 참조변수명.접근할 변수명 또는 메서드명();

// 객체 생성
Person person01 = new Person();

// person01 객체의 변수에 접근하여 값 할당
person01.personName = "wonjun";

// person01 객체의 메서드 호출
person01.walk(10);       // 사람이 10km 속도로 뛰어갑니다.

 

 

 

 

 

 

2-6. 생성자(Constructor)

- 생성자란, 객체가 생성될 때 호출되는 메서드입니다.

 

- 객체를 생성할 때 인스턴스 변수를 초기화하고, 모든 클래스에 반드시 1개 이상 존재합니다.

 

- 객체를 생성하면서 객체에 데이터를 넣어주고 싶을 때 사용합니다.

 

- 파라미터(Parameter)가 없는 기본 생성자는 이미 클래스 내부에 존재하는 것과 같습니다.

이러한 이유로 특별히 생성자를 정의하지 않고도 객체를 생성할 수 있으며 자바 컴파일러가 기본적으로 제공해 주기 때문입니다.

 

- 생성자의 이름은 클래스명과 동일하며 리턴값을 가지지 않습니다. 리턴값을 가지지 않지만 메서드의 반환 타입을 void로 따로 지정할 필요는 없습니다.

// 각각의 객체를 생성할 때 생성자 메서드를 호출한다.
Person person01 = new Person("철수");
person01.walk(10);

Person person02 = new Person("영희");
person02.walk(20);

Person person03 = new Person("민희");
person03.walk(30);

 

 

 

 

 

2-7. 메서드의 다중 정의

- 메서드 오버로딩(Overloading)이라고 정의합니다.

 

- 메서드 오버로딩이란 동일한 이름의 메서드를 중복하여 정의하는 것을 말합니다.

 

- 기본적으로는 한 클래스 내에 동일한 이름을 가진 메서드를 2개 이상 가질 순 없지만 매개변수의 개수나 데이터 타입을 다르게 하면 메서드를 오버로딩할 수 있게 됩니다.

 

 

 

 

2-8. 참조변수 this, 생성자 this()

- 참조변수 this : 객체 자기 자신을 참조하는데 사용되는 변수이며 객체의 주소가 저장되어 있습니다.

- 생성자 this() : 같은 클래스의 다른 생성자를 호출할 때 사용합니다.

 

 

 

 

 

 

 

3. Java의 Encoding, ASCII, EUC-KR, UTF-8

3-1 ASCII 코드

- 7 Bit를 가지고 알파벳, 공백, 쉼표, 특수문자 등을 표현하는 문자 체계입니다.

 

- 최상위 비트는 0으로 고정되어 있고 7 Bit를 사용하여 1 Byte로 구성되어 있습니다.

 

- ASCII 코드로 영어를 나타내는 건 문제가 없지만 한글을 포함하여 다른 언어를 나타낼 수 없습니다.

 

 

 

 

3-2. Extended ASCII 코드

- 128~255 부분에 해당하는 빈 공간을 이용하는 방법을 의미합니다. (최상위 비트 = 1)

 

- 최상위 비트를 1로 설정하면 유럽에서 사용하는 특수한 형태의 문자를 나타낼 수 있습니다. (Latin -1)

 

- 한글도 이와 같은 방법을 사용합니다.

만약 첫 비트가 0인 경우 : 영어로 인식

만약 첫 비트가 1인 경우 : 2 Byte씩 읽어서 첫 비트를 버린 후 5 Bit씩 끊어 초성, 중성, 종성에 각각 대응

이와 같은 인코딩 기법을 "KSC5601"이라고 부르며 Java의 인코딩 기법에서 KSC5601은 "EUC-KR"과 동일한 기법이며 Windows에서는 "MS949"와도 동일한 기법입니다.

 

 

 

 

3-3. Unicode

- 이러한 문제점을 해결하기 위해 국제표준화기구(ISO)는 표준화 작업을 진행했으며 데이터가 전 세계 어디에서나 동일한 형식으로 인식되어야 한다는 점에 초점을 맞추어 기존의 ASCII 인코딩 기법을 버리고 2 Byte를 기준으로 인코딩하는 유니코드(Unicode)를 개발하였습니다.

 

- 유니코드의 경우 각 나라별로 자신의 언어가 속하고 있는 고유한 공간을 할당받습니다.

 

 

 

 

3-4. UTF-8

- UTF-8은 가변 길이를 지원하여 각 언어별로 최적화된 크기에 저장할 수 있도록 합니다. 1 Byte에서 3 Byte까지 표현이 달라지는데 영문의 경우 1 Byte로 나타내고 한글의 경우 3 Byte로 나타냅니다.

 

 

 

 

3-5. Java는 어디에서 인코딩이 적용되는가?

- Byte 데이터를 기준으로 문자를 만들어내는 모든 부분에서 적용됩니다.

 

- 예를 들면, char와 String 클래스, 바이트 스트림에서 문자 스트림으로 변환하는 클래스에서 적용됩니다.

 

 

 

 

3-6. String과 인코딩

- String 클래스에서는 바이트 배열을 어떤 인코딩 기법으로 해석하여 문자를 생성할 것인지 지정하는 생성자가 존재합니다.

 

- 반대로 String 객체에서 어떤 인코딩 기법을 이용해 바이트 배열로 분해할지 지정하는 getBytes() 메서드가 존재합니다.

 

 

 

 

4. 실습 내용

4-1. 파일 읽기 (1)

import java.io.FileReader;
import java.io.IOException;

public class FileRead {
    public static void main(String[] args) throws IOException {
        FileReader reader = new FileReader("C:\\Users\\82104\\Desktop\\Hello.txt");

        // 정수형 변수 선언
        int ch;

        // 파일 읽기
        while ((ch = reader.read()) != -1) System.out.print((char) ch);
    }
}

<실행 결과>

 

 

 

 

 

4-2. 파일 읽기 (2) 

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class Fileread2 {
    public static void main(String[] args) throws IOException{

        Scanner scanner = new Scanner(new File("C:\\Users\\82104\\Desktop\\Hello.txt"), "euc-kr");
        System.out.println("123");

        while (scanner.hasNextLine() ) {
            String str = scanner.nextLine();
            System.out.println(str);

        }
        // 파일 닫기
        scanner.close();
    }
}

 

 

 

 

 

 

4-3. DISC 성격유형 검사

import java.util.Scanner;

public class DiscTest {
    public static void main(String[] args) {
        // DISC 성격유형검사 : 20170931 유원준
        char disc[][] = { {'B', 'A', 'D', 'C'}, {'B', 'C', 'D', 'A'}, {'C', 'A', 'D', 'B'},
                 {'D', 'A', 'C', 'B'}, {'A', 'C', 'D', 'B'} };

        char input;
        String inputs;
        int D = 0, I = 0, S = 0, C = 0;

        int n = disc.length;

        System.out.println(n);

        Scanner scan = new Scanner(System.in);
        System.out.printf("DISC 성격 유형 검사를 시작합니다.%n");
        System.out.printf("A, B, C, D를 입력하세요 : ");

        // 사용자로부터 입력받는다.
        inputs = scan.nextLine();

        for (int i = 0; i < n; i++) {
            // 하나씩 입력할 경우 문자열의 첫글자를 char 타입으로 변환
            input = inputs.charAt(i);

            if (input == disc[i][0]) ++D;
            if (input == disc[i][1]) ++I;
            if (input == disc[i][2]) ++S;
            if (input == disc[i][3]) ++C;
        }

            System.out.printf("  D = %2d", D);
            System.out.printf("  I = %2d", I);
            System.out.printf("  S = %2d", S);
            System.out.printf("  C = %2d%n", C);
        }
    }

<실행 결과>

 

 

 

 

 

 

 

- 학부에서 수강했던 전공 수업 내용을 정리하는 포스팅입니다.

- 내용 중에서 오타 또는 잘못된 내용이 있을 시 지적해 주시기 바랍니다.

댓글