본문 바로가기

IT&코딩/Java

Java - 8일차 (객체지향 프로그래밍(클래스))

728x90
반응형

기존 절차적 프로그래밍의 과정은

변수 선언 - 입력 - 계산 - 출력의 순서를 거친다.

 

객체지향 프로그래밍은 모듈단위(기능위주)

main에 a, b, c, d 기능이 각각 존재한다고 했을 때, 필요한 기능을 불러다 쓸 수 있다.

순서가 중요한 것이 아니라 기능이 잘 작동하는지가 중요하다.

 

■ 객제치향언어

 

1. 코드의 재사용성이 높다

- 새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다.

2. 코드의 관리가 용이하다.

- 코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.

3. 신뢰성이 높은 프로그래밍을 가능하게 한다.

- 제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다.

4. 객체지향의 가장 큰 장점 : '코드의 재사용성이 높고 유지보수가 용이하다'

5. 특징 

- 캡슐화(은닉화), 상속, 다형성, 추상화

 

■ 클래스와 객체의 정의와 용도

 

클래스란 객체를 정의해 놓은 것 (클래스는 객체의 설계도)

클래스는 객체를 생성하는 데 사용됨.

객체의 정의 : 실제로 존재하는 것 혹은 사물 또는 개념

객체의 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름

 

객체의 개념을 이해하려면

1. (관념의) 객체 (Object) 

- 내가 표현하고 싶은 데이터 (표현이라는 말의 의미는 '생각하면')

코딩이 아니라 생각이 곧 object. (와플을 떠올림)
2. 클래스 (Class)

- 틀, 설계도 (와플틀)
3. (실제의) 개체(객체)(Instance)

- 실제 찍어낸 한 개의 객체

 

■ 클래스의 구조

 

□ 클래스 헤더

접근제한자 : 현재 클래스를 생성하고 사용하는 데 있어 제한을 둔다는 의미

접근 제한자를 안 쓰면 default, 클래스 종류를 쓰지 않으면 일반 클래스.

 

클래스 종류 : final, abstreact(추상)등 어떤 클래스인지 알리는 수식어

 

멤버 필드 : 내가 표현하고 싶은 데이터라면 가져야 할 특성, 특징, 속성

 

1) 변수, 상수

2) 객체가 만들어질 때 특징적인 속성을 담아두는 것

3) static 변수, 상수와 instance 변수, 상수로 나뉨.

 

  생성자 : 생성자는 클래스 이름과 동일해야 한다.

 

piblic() { 내용 }

매개변수가 없는 생성자를 default contructor라고 한다.

생성자를 하나도 안 만들면 JVM이 디폴트 생성자를 자동으로 만들어줌.

- 멤버필드를 초기화하는 역할

 

 멤버 메소드 : 기능, 동작

 

1) 특정한 일을 수행하는 행위, 다시 말해 동작을 나타냄

2) static 메소드, instance 메소드로 나뉨

3) getter와 setter를 만들어야 한다. 안 쓰는 것과 없어서 못 쓰는 것은 다르기 때문에 당분간은 무조건 만들 것.

 

참고 : 사용시

 

Car myCar = new Car();

클래스 변수 = 생성자 // 객체의 생성

myCar.메소드(); 

 

형식은 무조건 객체.메소드 / 객체.멤버로 쓴다.

 

■ 클래스의 정의

 

new로 만드는 것들은 자동으로 Heap 영역으로 가서 자동초기화 됨.

 

기본자료형은 Stack

배열, 클래스는 Heap

 

■ 객체의 생성

new라는 키워드를 통해 무조건 메모리의 공간을 할당받고 생성자를 호출하여 생성

예제 전에) 하나의 파일에 클래스가 여러개라면 그 중에서 public이 붙을 수 있는 건 하나다.

보통 public이 붙은 클래스가 main을 가지고 있다.

 

Sample sp = new Sample() 이 생성자 없어도 가능한 이유 : 자동으로 default가 만들어지기 때문에

 

package jun.java.exam01;

public class Sample {
	int x;
	int y;
}

 

package jun.java.exam01;

public class SampleEx {
		public static void main(String[] ar) {
			Sample sp = new Sample();
			System.out.println(sp.x);
			// 자바에서 포함 멤버들이 각각 접근 지정자를 가진다.
		}
}

 

<결과>

0

 

클래스 정의의 핵심은 '멤버'다.

멤버필드를 어떻게 정의하느냐가 개발에서 가장 핵심이다. (그래서 은닉화가 중요하다)

보통 멤버를 숨길 때 쓰는 게 접근생성자 private int x 이고 이것을 은닉화라고 한다. (해당 클래스 내부에서만 사용하겠다)

 

// public Sample(){} ->숨겨져 있는 디폴트 생성자

내가 직접 디폴트생성자를 만들고 싶으면 이클립스 상단탭의 Source -> Generate Contructors from Superclass 클릭

 

getter, setter는 Source -> Generate Getters and Setters

sp.getX

sp.setX

 

private을 해서 은닉화를 하고 getter setter나 메소드를 만들어서 기능을 사용하는 것을 '캡슐화'라고 한다.

 

1. 멤버 필드

 

변수와 상수(속성) 즉  데이터라고도 하는데 이것은 객체가 만들어질 때에 그 객체의 특징적인 속성을 담아두는 것이다. 여기서 필드의 형태가 static인지 instance인지에 따라 필드개념이 달라진다. 

 

[상수] : 상수라는 것은 고정된 값을 의미하며 프로그램이 종료될 때까지 절대로 변하지 않는 값(속성)이다.

[변수] : 변수는 상수와는 반대로 프로그램이 종료될 동안 값이 변경될 수 있는 값(속성)을 의미한다.

 

형식 : 접근자 지정어 자료형 변수명 [ = 값 ] ;

 

접근자 : private, protected, public (안 적으면  friendly = none = package 적용됨)

접근자 = 접근제한자
① private
클래스 내부에서만 사용가능
② default = package : 안 쓰면
클래스 내부 + 같은 패키지(폴더)에서 사용가능
③ protected 
클래스 내부 + 같은 패키지(폴더) + 상속관계
④ public
누구나 다 

 

지정어 : final, static (쓸 수도 있고 안 쓸 수도 있음, 둘다 해당하면 둘다 써도 된다)

ex) public static final double pie = 3.141592; 또는 int x;

 

2. 멤버 메소드

 

메소드는 특정한 일을 수행하는 행위, 다시 말해 동작을 의미하는 것이다.

멤버 필드들의 값을 가지고 작업을 수행할 수도 있으며 메소드도 static메소드(클래스 메소드)와 instance 메소드라는 2종류가 있다. 간단히 설명하자면 static메소드(클래스 메소드)는 메소드를 가지는 객체를 생성하지 않아도 사용할 수 있지만 instance 메소드는 객체를 생성해야만 사용이 가능하다.

 

형식 : 접근자 지정어 반환형 return값 method명 (매개변수들) { 정의부; }

지정어 : static, final,

              native(외부언어를 Java에 넣기 위해), syncronized --> 생략가능

native : 하드웨어 제어, 드라이버는 자바로 못해서 못하는 기능을 자바로 끌어오려면 JNI ( Java Native Interface) 
synchronized(동기화) : 생략가능 , 문을 잠그는 거라고 생각하면 된다.

결과형보다는 반환형이라고 쓸 것

 

3. Constructor (생성자)

 

생성자는 객체의 생성을 컴퓨터에게 알리는 역할과 초기화 역할을 한다.

형식 : 접근자 class명 (매개변수들) { 정의부; }

접근자 : public, package

지정어, 결과형 return값은 사용하지 않는다.

 

접근자는 private도 가능하지만 그럼 외부에서 new를 사용해서 찍어낼 수가 없다. (방법이 없는 건 아니다)

매개변수가 없는 생성자는 default 생성자라고 부른다.

 

객체의 생성을 컴퓨터에게 알리는 역할

- A ap = new A(); -> 자료형이 A라는 class의 형태

- A bp = new A(); 

컴퓨터는 이 두 개를 어떻게 구분할까? 자바는 hasdcode라는 것으로 구분 (주민등록번호)

new는 출생신고라고 보면 된다. new를 사용함으로써 해시코드가 부여되는 것이다. 

 

■ 접근제한자

 

멤버들은 객체 자신들만의 속성이자 특징이므로 대외적으로 공개되는 것이 결코 좋은 것은 아니다. 그런 이유로 프로그래머가 객체의 멤버들에게 접근 제한을 걸 수가 있는데 자바에서는 이를 접근제한자라 한다.

 

■ 캡슐화

 

여러개의 처리 과정을 하나의 부품처럼 사용하므로 객체간의 이식성이 높고 자료 또는 내부 수정작업을 할 때에도 외부객체에서는 이것을 인식하지 못하는 독립적인 장점이 있다.

 

[기술적인 면] : 사용법을 제공을 받아서 사용하는 측면, 즉 캡슐화로 된 자료를 사용자에게 내부적인 접근을 허용하지 않더라도 사용자에게 사용방법을 알려주고 사용하게 해주는 것이다.

 

정보은닉 : 정보 은닉은 캡슐화의 장점에 속하는 것이다. 외부에서 "참조형 변수.멤버필드"의 형식을 차단하고, 접근이 용이한 메소드를 통해 결과를 받게 하는 것이다.

 

package jun.java.exam03;

	class Salary {
	private int pay;
	
	public int getPay() {
		return pay;
	}
	
	public void setPay(int pay, String pass) {
		if(pass.equals("1234"))
			this.pay = pay;
	}
}
	public class SalaryEx {
		public static void main(String[] ar) {
			Salary sal = new Salary();
			// sal.pay = 10000;
			// System.out.println("내 계좌를 마음대로" + sal.pay);
			sal.setPay(10000, "1234");
			int myPay = sal.getPay();
			System.out.println("계좌에 입금한 금액" + myPay);
		}
	}

 

■ 메소드

 

1. 메소드(멤버함수)란? 객체가 할 수 있는 동작을 정의하는 것이며 메소드 또한 instance 메소드와 static 메소드로 나뉜다.

 

2. 메소드의 구성

3. 접근제한 

자바나 객체나 멤버들에 대한 접근을 제한하는 방법을 의미한다. 

public, protected, default, private의 종류로 나눌 수 있다.

 

4. 반환형

메소드(멤버함수)에서 해야 할 일들을 모두 끝내고 마지막으로 메소드(멤버함수) 자신을 불러준 곳으로 반환하는 값의 자료형을 의미하는 것이다. 만약 반환 값이 없다면 void라는 예약어로 대체해야 한다. 즉 생략은 불가능하다는 뜻이다.

 

5. 메소드명

 

6. 인자

Arguments라고도 하며 이것은 메소드(멤버함수)를 호출할 때 필요에 따라 특정 값을 제공해주기 위해 미리 선언하는 것이며 메소드(멤버함수)를 호출할 때 반드시 인자의 자료형과 수가 일치해야 한다.

 

7. 수행문

식 수행 및 제어문 또는 실행문 등을 의미한다.

 

package jun.java.exam04;

public class MethodEx {
	
	public int sum(int i, int j) {
		return i + j;
	}
	
	public int sub(int i, int j) {
		return i - j;
	}
	
	public int multi(int i, int j) {
		return j * i;
	}
	
	public int divi(int i, int j) {
		return j / i;
	}
}

 

package jun.java.exam04;

public class MethodExOne {
	public static void main(String[] args) {
		MethodEx ref =new MethodEx();
		
		int i = 10;
		int j = 10;
		System.out.println("더한 값 : " + ref.sum(i, j));
		System.out.println("뺀 값 : " + ref.sub(i, j));
		System.out.println("곱한 값 : " + ref.multi(i, j));
		System.out.println("나눈 값 : " + ref.divi(i, j));
	}
}

 

<결과>

더한 값 : 20
뺀 값 : 0
곱한 값 : 100
나눈 값 : 1

 

* 메소드에서 생각해 볼 문제 *

 

package jun.java.exam05;

public class MethodExTwo {
	
	int var1, var2; // 멤버 변수들
	public int sum(int a, int b) { // 메소드(멤버 함수)
		return a + b;
	}
	
	public static void main(String[] ar) {
		MethodExTwo me = new MethodExTwo();
		int res = me.sum(1000, -10);
		System.out.print("res = " + res);
	}
}

// 생각해 볼 문제
// 돌려 받는 값은 숫자 하나. 숫자 두 개 받으면 안 되나? 여러개 받을 수는 없나?
//

 

<결과>

res = 990

 

문제 1 : 돌려받는 값은 하나인데 여러개를 받을 수는 없는 것일까?

--> call by value이다 call by reference를 쓰면 된다.

 

package jun.java.exam06;

public class MethodExThree {
	private int var;
	
	public void setVar(int var) {
		this.var = var; // 문제발생
	}
	
	public int getVar() {
		return var;
	}
	
	public static void main(String[] args) {
		MethodExThree me = new MethodExThree();
		me.setVar(10000);
		System.out.println("var = " + me.getVar());
	}
}

// 왜 getVar 했을 때 1000이 아니라 0이 나올까?
// setVar의 매개변수 int var는 지역변수
// 전역변수와 지역변수가 겹치는 부분에서는 지역변수가 우선된다. 
// 멤버 필드는 기본적으로 전역변수 
// 그럼 전역변수를 어떻게 불러오는가.

 

<결과>

var = 0

 

문제 2 : 왜 getVar 했을 때 1000이 아니라 0이 나올까? 

 

setVar의 매개변수 int var는 지역변수이고, 전역변수와 지역변수가 겹치는 부분에서는 지역변수가 우선된다.

멤버필드는 기본적으로 전역변수이다.

 

그럼 기본적으로 전역변수를 어떻게 불러오는가? --> 메소드 오버로딩 = 메소드 중복정의

 

728x90
반응형

'IT&코딩 > Java' 카테고리의 다른 글

Java - 10일차 (상속과 다형성)  (0) 2022.10.26
Java - 9일차 (객체지향 프로그래밍(클래스)2)  (0) 2022.10.24
Java - 7일차 (Game 설계)  (0) 2022.10.23
Java - 6일차 (배열)  (0) 2022.10.20
Java - 5일차 (제어문)  (0) 2022.10.20