과목명 : 객체지향 프로그래밍(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);
}
}
<실행 결과>
- 학부에서 수강했던 전공 수업 내용을 정리하는 포스팅입니다.
- 내용 중에서 오타 또는 잘못된 내용이 있을 시 지적해 주시기 바랍니다.
'전공 수업 > 객체 지향 프로그래밍(Java)' 카테고리의 다른 글
[11주 차] - 메서드 오버로딩, 생성자, 참조변수 this, 멤버 변수 초기화 (0) | 2022.11.10 |
---|---|
[10주 차] - 클래스 변수, 인스턴스 변수, 지역 변수, 클래스 메서드와 인스턴스 메서드 (0) | 2022.11.06 |
[7주 차] - Math.random() 메서드, 제어문(반복문, 조건문)을 사용한 코드 예제 (0) | 2022.10.12 |
[6주 차] - 배열(Array)의 선언과 생성, 초기화, 다차원 배열 (2) | 2022.10.07 |
[5주 차] - 조건문(if, if-else, else-if, switch 문), 난수를 생성하는 Math.random() 메서드 (0) | 2022.09.29 |
댓글