열심히 끝까지
Java1 day05 본문
[5일차 수업 내용]
1. 객체지향언어 ( 클래스와 객체 )
2. 변수와 메소드
============================================================================
[ 객체지향언어 ( 클래스와 객체 ) ]
1. 객체지향언어
- 기본 개념은 ' 실제 세계는 사물(객체)로 이루어져 있으며 발생하는 모든 사건들은 사물간의 상호작용이다. '
라는 것
- 실제 사물의 속성과 기능을 분석한 다음 데이터(변수)와 함수로 정의함으로써 실제 세계를 컴퓨터 속에
옮겨놓은 것과 같음
- 객체지향언어의 주요 특징
① 코드의 재사용성이 높다.
- 새로운 코드를 작성할 대 기존의 코드를 이용하여 쉽게 작성할 수 있음
② 코드의 관리가 용이하다.
- 코드의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있음
③ 신뢰성이 높은 프로그래밍을 가능하게 함
- 제어자와 메소드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며,
코드의 중복을 제거하여 코드의 불일치로 인한 오작동을 방지할 수 있음
2. 클래스와 객체
2-1 ) 클래스와 객체의 정의와 용도
- 클래스란 객체를 정의해 놓은 것이며 클래스는 객체를 생성하는데 사용
(객체를 만드는 틀 = 클래스)
- 객체의 사전적인 정의는 실제로 존재하는 것
- 객체지향이론에서는 사물과 같은 유형적인 것뿐만 아니라 개념이나 논리와 같은 무형적인 것들도
객체로 간주
Ex) 클래스 객체
제품설계도 제품
Tv 설계도 Tv
붕어빵기계 붕어빵
2-2 ) 객체와 인스턴스
- 클래스로부터 객체를 만드는 과정을 클래스의 인스턴스라고 하며
어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스(instance)라고 함.
Tv는 Tv클래스의 인스턴스
Tv는 객체이다. ( 엄격히 구분할 필요는 없음)
2-3 ) 객체의 구성요소 - 속성과 기능
- 객체는 속성과 기능, 두 종류의 구성요소로 이루어져 있으며 일반적으로 객체는
다수의 속성과 다수의 기능을 가짐
- 즉, 객체는 속성과 기능의 집합
- 객체가 가지고 있는 속성과 기능을 그 객체의 멤버(member) 라고 함
- 클래스는 객체를 정의한 것
=> 클래스로부터 객체를 생성하면 정의된 속성과 기능을 가진 객체가 만들어 짐
* 속성(property), 멤버변수(member variable), 특성(attribute), 필드(field), 상태(state)
* 기능(fuction), 메소드(method), 함수(function), 행위((behavior)
2-4 ) 인스턴스의 생성과 사용
- 클래스로부터 인스턴스를 생성하는 방법은 아래와 같이 여러가지가 있음
클래스 변수명; // 클래스의 객체를 참조하기 위한 참조변수 선언
변수명 = new 클래스명(); // 클래스의 객체를 생성한 후, 객체의 주소를 참조변수에 저장
Tv t;
t = new Tv();
Tv t = new Tv();
Tv t1 = new Tv(); // t 와 t1은 서로 독립적
- 인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 함
- 같은 클래스로부터 생성되었을지라도 각 인스턴스는 서로 독립적
Tv[] t = new Tv[3]; int[] ar = new int[3];
t[0] = new Tv(); ar[0] = 10;
t[1] = new Tv(); ar[1] = 20;
t[2] = new Tv(); ar[2] = 30;
- 객체 역시 배열로 다루는 것이 가능하며 이를 ' 객체 배열 ' 이라고 함
2-5 ) 클래스의 또 다른 정의
① 클래스 - 데이터와 함수의 결합
변수 -> 배열(변수의 묶음) -> 구조체(다른 값들도 담은 배열) -> 클래스
② 클래스 - 사용자 정의 타입(user-defined type)
- 프로그래밍언어에서 제공하는 자료형 외에 프로그래머가 서로 관련된 변수들을
묶어서 하나의 타입으로 새로 추가하는 것을 "사용자 정의 타입"이라고 함
============================================================================
[ 변수와 메소드 ]
1. 변수와 메소드
1-1 ) 선언 위치에 따른 변수의 종류
- 변수는 클래스변수(static), 인스턴스변수, 지역변수 총 3가지 존재
- 변수의 종류를 결정짓는 중요한 요소는 '변수의 선언된 위치',
=> 변수의 종류를 파악하기 위해서는 변수가 어느 영역에 선언되었는지를 확인하는 것이 중요
- 멤버변수를 제외한 나머지 변수들은 모두 지역변수,
멤버변수 중 static이 붙은 것은 클래스변수
붙지 않는 것은 인스턴스 변수
변수의 종류 | 선언 위치 | 생성시기(사용가능시기) |
클래스변수 | 클래스영역 | 클래스가 메모리에 올라갔을 때 |
인스턴스변수 | 인스턴스가 생성되었을 때 | |
지역변수 | 클래스 영역 이외의 영역 (메소드, 생성자, 초기화블록...) |
변수 선언문이 수행되었을 때 |
① 인스턴스 변수 ( instance variable )
- 클래스 영역에 선언, 클래스의 인스턴스를 생성할 때 만들어짐
- 인스턴스 변수의 값을 읽어오거나 저장하기 위해서는 먼저 인스턴스를 생성해야 함
② 클래스 변수 ( class variable )
- 클래스변수를 선언하는 방법은 인스턴스변수 앞에 static을 붙이기만 하면 됨
- 클래스변수는 모든 인스턴스가 공통된 저장공간(변수)를 공유
- 클래스변수는 인스턴스변수와 달리 인스턴스를 생성하지 않고도
언제라도 바로 사용할 수 있는 특징을 가지고 있음
- '클래스이름 . 클래스변수' 와 같은 형식으로 사용
③ 지역 변수 ( local variable )
- 메소드 내에 선언되며 메소드 내에서만 사용 가능
=> 메소드가 종료되면 소멸되어 사용 불가
- for문 또는 while문의 블록 내에 선언된 지역변수가 선언된 블록{ } 내에서만 사용 가능
=> 블록을 벗어나게 되면 소멸되어 사용 불가
* 인스턴스 변수는 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만,
클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 가짐
2. 메소드(method)
- 메소드는 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것
- 기본적으로 수학의 함수와 유사, 어떤 값을 입력하면 이 값으로 작업을 수행해서 결과를 반환
2-1 ) 메소드를 사용하는 이유?
① 높은 재사용성(reusability)
- 한번 만들어 놓은 메소드는 몇번이고 호출 가능
다른 프로그램에서도 사용 가능
② 중복된 코드의 제거
- 같은 내용의 문장들이 여러 곳에 반복해서 나타난다면
이렇게 반복되는 문장들을 묶어서 하나의 메소드로 작성해 놓으면
반복되는 문장들 대신 메소드를 호출하는 한 문장으로 대체
③ 프로그램의 구조화
- 큰 규모의 프로그램에서는 문장들을 작업단위로 나눠서 여러 개의 메소드에 담아
프로그램의 구조를 단순화시키는 것이 필수
- main 메소드는 프로그램의 전체 흐름이 한 눈에 들어올 정도로 단순하게 구조화하는 것이 좋음
2-2 ) 메소드의 선언과 구현
- 메소드는 크게 두 부분, 선언부와 구현부로 이루어져 있음
- 메소드를 정의한다는 것은 선언부와 구현부를 작성한다는 뜻
반환타입 메소드이름 ( 타입 변수명, 타입 변수명 ... ) {
// 메소드 호출 시 수행될 코드
}
Ex ) int sum ( int number ) { // { 전까지 선언부
return number + 10; // { 부터 } 까지 구현부
}
① 메소드 선언부( method declaration, method header )
- 메소드가 작업을 수행하기 위해 어떤 값들을 필요로 하고,
작업의 결과로 어떤 타입의 값을 반환하는 지에 대한 정보를 제공
- 메소드 선언부는 후에 변경사항을 발생하지 않도록 신중히 작성
② 매개변수 선언( parameter declaration )
- 매개변수는 메소드가 작업을 수행하는데 필요한 값들을 제공받기 위한 것,
필요한 값의 개수만큼 변수를 선언하여 각 변수간의 구분을 쉼표로 사용
③ 메소드 이름( method name )
- 메소드는 특정 작업을 수행하므로 메소드의 이름은 동사인 경우가 대다수
메소드의 기능을 쉽게 알 수 있도록 함축적이면서도 의미있는 이름을 짓도록 노력해야 함
④ 반환타입( return type )
- 메소드는 작업수행 결과인 반환값( return value )의 타입을 적음
- 반환값이 없는 경우 반환타입으로 void를 적음
⑤ 메소드의 구현부( method body, 메소드 몸통 )
- 메소드의 선언부 다음에 오는 괄호를 메소드의 구현부라고 함
여기서 메소드를 호출했을 때 수행될 문장들을 기록
⑥ return문
- 메소드의 타입이 void가 아닌 경우 구현부 안에
"return 반환값'" 이 반드시 포함되어 있어야 함
- 이 문장은 작업을 수행한 결과인 반환값을 호출한 메소드로 전달함
=> 이 값의 타입은 반환타입과 일치하거나 적어도 자동형변환이 가능한 것이어야 함
- return 문은 단 하나의 값만 반환 가능
long return 10; <- 가능
int return 10L; <- 불가능
return 1, 2, 3, 4 <- 불가능(여러 값을 한꺼번에 변환 불가능)
return 1 / return 2 .... <- 가능(하나씩 값을 변환)
2-3 ) 메소드의 호출
- 메소드를 정의했어도 호출하지 않으면 아무런 일도 일어나지 않음
- 메소드를 호출해야만 구현부의 문장들이 수행
- int sum(int num) { } ==> sum(10);
메소드이름(파라미터);
2-4 ) JVM의 메모리 구조
-----------------------------------------------------------------------------------------------------------------------------------Method Area
클래스 데이터 ( cv : class variable )
-----------------------------------------------------------------------------------------------------------------------------------Call Stack
main ( lv : variable )
-----------------------------------------------------------------------------------------------------------------------------------Heap
인스턴스 ( iv : instance variable )
-----------------------------------------------------------------------------------------------------------------------------------
① 메소드 영역 ( Method area )
- 프로그램 실행 중 어떤 클래스가 사용되면, JVM인 해당 클래스의 클래스파일을 분석하여
클래스에 대한 정보를 이곳에 저장
- 이 때 그 클래스의 클래스변수(static변수)도 이 영역에 함께 생성
② 힙 영역 ( Heap area )
- 인스턴스가 생성되는 공간, 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 저장
③ 호출 스택 ( Call area ) - LIFO ( Last in First Out )
- 호출스택은 메소드의 작업에 필요한 메모리 공간을 제공
- 메소드가 호출되면, 호출스택에 호출된 메소드를 위한 메모리가 할당
이 메모리는 메소드가 작업을 수행하는 동안 지역변수들과
연산의 중간결과들을 저장하는데 사용
2-4 ) 기본형 매개변수와 참조형 매개변수
- 자바에서는 메소드를 호출할 때 매개변수로 지정한 값을 메소드의 매개변수에 복사하여 넘겨줌
- 매개변수의 타입이 기본형일 때는 기본형 값이 복사, 참조형이면 인스턴스의 주소가 복사
int add(int a, int b){ } ==> add(10, 20);
void method(Tv tv){ } ==> Tv t = new Tv();
tv의 주소가 100 method(t); // t의 주소가 100
기본형 매개변수 변수의 값을 읽기만 할 수 있음( read only )
참조형 매개변수 변수의 값을 읽고 변경할 수 있음( read & write )
- 이 때 반환타입이 참조형이라는 것은 메소드가 객체의 주소를 반환한다는 것
--------------------------------------------------------------------------------------------------------------------------------
package example01;
public class Tv {
// Tv의 속성(멤버변수, member variable)
String color; // 색상
boolean power // 전원상태(on/off)
int channel; // 채널
// Tv의 기능(메소드, method)
void power() { // Tv를 켜거나 끄는 기능을 하는 메소드
power = !power;
}
void channelUp() { // Tv의 채널을 높이는 기능을 하는 메소드
++channel;
}
void channelDown() { // Tv의 채널을 낮추는 기능을 하는 메소드
--channel;
}
}
---------------------------------------------------------------------------------------------------------------------
package example01;
public class TvEx01 {
public static void main(String[] args){
// step 1 : Tv 인스턴스를 참조하기 위한 참조변수 t 선언
Tv t;
// step 2 : Tv 인스턴스를 생성하고 참조변수와 연결
t = new Tv();
// step 3 : Tv 인스턴스의 멤버변수 channel의 값을 7로 변경
t.channel = 7;
System.out.println("channel : " + t.channel); // 7
// step 4 : Tv 인스턴스의 메소드 ChannelDown()을 호출
t.channelDown();
System.out.println("channel : " + t.channel); // 6
Tv t1 = new Tv();
System.out.println("channel : " + t1.channel); // 0(초기값)
}
}
-------------------------------------------------------------------------------------------------------------------------------
package example01;
public class TvEx03 {
public static void main(String[] args) {
// 객체배열
int number1 = 1;
int number2 = 2;
int number3 = 3;
// 위 변수들을 하나로 합칠 수 없을까? -> 배열 탄생
int[] number = new int[3];
number[0] = 1;
number[1] = 2;
number[2] = 3;
Tv t1 = new Tv();
Tv t2 = new Tv();
Tv t3 = new Tv();
// 위 변수들을 하나로 합치 수 없을까? -> 객체배열 탄생
Tv[] t = new Tv[3];
t[0] = new Tv();
t[1] = new Tv();
t[2] = new Tv();
// 아래 객체배열의 모든 칸을 채워넣어라 단, for문을 이용해서
Tv[] tvs = new Tv[5];
for(int i = 0; i < tvs.length; i ++){
tvs[i] = new Tv();
tvs[i].channel = i + 10;
System.out.println("각 tv의 채널 : " + tvs[i].channel);
}
}
}
----------------------------------------------------------------------------------------------------------------
package example02;
public class MemberCallTest {
int iv = 10; // 인스턴스변수
static int cv = 20; // 클래스변수
// static int cv2 = iv; // 에러
/*
* 클래스 변수는 인스턴스 변수를 사용할 수 없다.
* 왜why? 클래스변수가 메모리에 올라갈 때 인스턴스 변수는 생성이 안되어 있을 수도 있다.
* 즉, 만들어지지도 않은 애를 어떻게 변수로 올리는가?
*/
static int cv2 = new MemberCallTest().iv;
// iv를 보기 위해서 MemberCallTest를 열어주고 iv를 가져온다.
int iv2 = cv;
/*
* 인스턴스변수는 클래스변수를 사용할 수 있다.
* 왜why? 인스턴스변수가 메모리에 올라갈 때는 이미 클래스변수는 메모리에 올라가 있기 때문에
*/
}
----------------------------------------------------------------------------------------------------------------------
package example02;
public class MyMath {
// 덧셈, 뺄셈, 곱셈, 나눗셈 메소드
// 1. 두 개의 정수를 전달받아 두 수의 합을 return 하는 메소드
int add(int a, int b) {
int result = a + b;
//return result; 1번째 방법
return a + b; // 2번째 방법 (바로 넘기기)
}
// 2. 두 개의 정수를 전달받아 두 수의 차를 return 하는 메소드
int substract(int a, int b) {
// int result = a - b;
return a - b;
}
// 3. 두 개의 정수를 전달받아 두 수의 곱을 return 하는 메소드
int multiply(int a, int b) {
int result = a * b;
return result;
}
// 4. 두 개의 정수를 전달받아 두 수의 결과를 return 하는 메소드(몫을 return)
int divide(int a, int b) {
// int result = a / b;
return a / b;
}
}
-------------------------------------------------------------------------------------------------------
package example02;
public class MyMathEx01 {
public static void main(String[] args) {
MyMath mm = new MyMath();
int result1 = mm.add(5, 3);
// return이 있는 메소드는 하나의 값으로 생각하자.
int result2 = mm.substract(10, 4); // mm.---를 하나의 값으로 볼 것
int result3 = mm.multiply(3, 4);
int result4 = mm.divide(10, 2);
System.out.println("result1 : " + result1);
System.out.println("result2 : " + result2);
System.out.println("result3 : " + result3);
System.out.println("result4 : " + result4);
System.out.println(mm.add(10, 20));
System.out.println(10 + 20);
System.out.println(30);
}
}
'Java1(주말)' 카테고리의 다른 글
Java1 day06 (0) | 2022.04.24 |
---|---|
Java1 day05 보충 (0) | 2022.04.24 |
Java1 day04 보충 (0) | 2022.04.23 |
Java1 day04 (0) | 2022.04.17 |
Java1 day03 보충 (0) | 2022.04.17 |