java와 객체지향언어

jungnoeun·2021년 9월 4일
0

java

목록 보기
5/22

객체지향언어의 특징

  1. 코드의 재사용성이 높다. (재사용성)
    새로운 코드를 작성할 때, 기존의 코드를 이용하여 쉽게 작성할 수 있다.
  2. 코드의 관리가 용이하다. (유지보수)
    코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.
  3. 신뢰성이 높은 프로그래밍을 가능하게 한다. (중복된 코드의 제거)
    제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거하여 코드의 불일치로 인한 오작동을 방지할 수 있다.





클래스와 객체

  • 클래스는 객체를 정의해놓은 것 또는 객체의 설계도 또는 틀이라고 정의할 수 있다.
  • 클래스는 객체를 생성하는데 사용되고 객체는 클래스에 정의된 대로 생성된다.
  • 예를 들어, TV설계도(클래스)는 TV라는 제품(객체)을 정의한 것이며, TV(객체)를 만드는데 사용된다.

클래스의 정의 : 클래스란 객체를 정의해 놓은 것이다.
클래스의 용도 : 클래스는 객체를 생성하는데 사용된다.

객체의 정의 : 실제로 존재하는 것. 사물 또는 개념
객체의 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름





객체와 인스턴스

  • 클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화라고 한다.
  • 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 한다.
  • 인스턴스와 객체는 같은 의미이지만 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖고 있다.
  • 그리고 인스턴스는 어떤 클래스로부터 만들어진 것인지 강조하는 보다 구체적인 의미를 가지고 있다.

클래스 --인스턴스화--> 인스턴스(객체)



객체와 구성요소 - 속성과 기능

  • 객체는 속성과 기능, 두 종류의 구성요소로 이루어져 있으며, 일반적으로 객체는 다수의 속성과 기능을 갖는다.
  • 그리고 객체가 갖는 속성과 기능을 그 객체의 멤버라고 한다.
  • 보통 속성보다는 멤버변수로, 기능보다는 메서드로 사용한다.



인스턴스의 생성과 사용

  • TV 클래스를 선언한 것은 tv설계도를 작성한 것에 불과하므로 tv인스턴스를 생성해야 제품(tv)를 사용할 수 있다.
  • 클래스로부터 인스턴스를 생성하는 방법은 다음과 같다.

클래스명 변수명; //1. 클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); //2. 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장

Tv t;  //Tv클래스 타입의 참조변수 t를 선언
t = new Tv();  //Tv인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장

인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 한다.

class Tv{
	String color;
	boolean power;
	int channel;
	
	void power() { power = !power; }
	void channelUp() { ++channel; }
	void channelDown() { --channel; }
}

public class OneEC {

	public static void main(String[] args) {
		Tv tv1 = new Tv();
		System.out.println("t1의 channel값은 "+ tv1.channel+ "입니다.");
		tv1.channel = 7;
		System.out.println("t1의 channel값은 "+ tv1.channel+ "입니다.");
		
	}

}

결과
t1의 channel값은 0입니다.
t1의 channel값은 7입니다.





객체 배열

객체 생성 방법

Tv[] tvArr = new Tv[3]; //참조변수 배열(객체배열)을 생성

//객체를 생성해서 배열의 각 요소에 저장
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();

//배열의 초기화 블럭을 사용하면 다음과 같이 한줄로 정리할 수 있다.
Tv[] tvArr = { new Tv(), new Tv(), new Tv() };

//다뤄야할 객체의 수가 많을 때는 for문을 사용하면 된다.
Tv[] tvArr = new Tv[100];
for(int i=0; i<tvArr.length; i++){
	tvArr[i] = new Tv();
}





클래스의 또다른 정의

데이터 저장형태의 발전과정
1. 변수 : 하나의 데이터를 저장할 수 있는 공간
2. 배열 : 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
3. 구조체 : 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
4. 클래스 : 데이터와 함수의 결합(구조체 + 함수)









변수와 메서드

  • 변수는 클래스변수, 인스턴스변수, 지역변수 모두 세가지가 있다.
  • 멤버변수를 제외한 나머지 변수들은 모두 지역변수이며, 멤버변수 중 static이 붙은 것은 클래스 변수, 붙지않은 것은 인스턴스 변수이다.
변수의 종류선언위치생성시기
클래스변수클래스영역클래스가 메모리에 올라갔을 때
인스턴스변수클래스 영역인스턴스가 생성되었을 때
지역변수클래스 영역 이외의 영역변수선언문이 수행되었을 때
  • 클래스 영역 이외의 영역 : 메서드, 생성자, 초기화 블럭 내부
class Variables
{
	int iv;   //인스턴스 변수 (클래스 영역)
    static int cv;  //클래스 변수(static변수, 공유변수) (클래스 영역)
    
    void method()
    {
    	int iv = 0;  //지역변수 (메서드 영역)
    }
}

인스턴스 변수 : 클래스의 인스턴스를 생성할때 만들어진다.

  • 인스턴스는 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있다.

클래스변수: 모든 인스턴스가 공통된 저장공간(변수)를 공유하게 된다.

  • 클래스 변수는 전역변수의 성질을 가진다.

지역 변수 : 메서드 내에 선언되어 메서드내에서만 사용가능하며, 메서드가 종료되면 소멸하여 사용하지 못한다.

  • 선언된 블럭{} 내에서만 사용가능하다.

인스턴스변수는 인스턴스가 생성될때마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 공간을 공유하므로, 항상 공통된 값을 갖는다.





메서드

  • 메서드는 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다.

메서드를 사용하는 이유
1) 높은 재사용성
2) 중복된 코드의 제거
3) 프로그램의 구조화

메서드의 선언과 구현

반환타입 메서드이름 (타입 변수명, 타입 변수명, ... ) // 선언부
{ //메서드 호출시 사용될 코드 } //구현부

int add(int a, int b)  //선언부
{	//구현부
	int result = a + b;
	return result; //호출한 메서드로 결과를 반환한다.
}

메서드의 호출

  • 메서드이름(값1, 값2,...); 와 같은 형식으로 메서드를 호출한다.

인자와 매개변수

  • 메서드를 호출할때 괄호()안에 지정해준 값들을 인자(argument) 또는 인수라고 한다.
  • 이때, 인자의 개수와 순서는 호출된 메서드에 선언된 매개변수와 일치해야 한다.
  • 그리고 인자는 메서드가 호출되면서 매개변수에 대입되므로, 인자의 타입은 매개변수의 타입과 일치하거나 자동형변환이 가능한 것이어야 한다.
double result = mm.divide(5L, 3L);

double divide(double a, double b){
	return a/b;
}
  • 호출시에 입력된 값은 메서드의 매개변수에 대입되는 값이므로, long형의 값을 double형 변수에 저장하는 것과 같아서 'double a = 5L'을 수행했을때와 같이 long형의 값인 5L은 double형 값인 5.0으로 자동형변환되어 divide의 매개변수 a에 저장된다.
  • 그래서 divide메서드에 두개의 정수값(5L, 3L)을 입력하여 호출하였음에도 불구하고 연산결과가 double형이 된다.









JVM 메모리 구조

기본형 매개변수와 참조형 매개변수

기본형 매개변수 : 변수의 값을 읽기만 할 수 있다.(read only)
참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다.(read&write)

class Data {int x;}

public class OneEC {

	public static void main(String[] args) {
		
		Data d = new Data();
		d.x = 10;
		System.out.println("main() : x = " + d.x);
		change(d.x); //기본형 매개변수 부르기
	        change(d); //참조형 매개변수로 부르기
		System.out.println("After change(d.x)");
		System.out.println("main() : x = " + d.x);
	}
	static void change(int x) { //기본형 매개변수
		x = 1000;
		System.out.println("change() : x = " + x);
	}
   	 static void change(Data d) { //참조형 매개변수
		d.x = 1000;
		System.out.println("change() : x = " + d.x);
	}

}

클래스 메서드(static)와 인스턴스 메서드

  • 인스턴스 메서드는 인스턴스 변수와 관련된 작업을 하는, 즉 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드이다.
  • 클래스메서드는 메서드 중에서 인스턴스와 관계없는 (인스턴스 변수나 인스턴스 메서드를 사용하지 않는) 메서드를 클래스 메서드(static)로 정의한다.
  1. 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통적으로 사용하는 것에 static을 붙인다.
  2. 클래스 변수(static변수)는 인스턴스를 생성하지 않아도 사용할 수 있다.
  3. 클래스 메서드(static변수)는 인스턴스 변수를 사용할 수 없다.
  4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.
  • 클래스의 멤버변수 중 모든 인스턴스에 공통된 값을 유지해야 하는 것이 있는지 살펴보고 있으면, static을 붙여준다.
  • 작성한 메서드중에서 인스턴스 변수나 인스턴스 메서드를 사용하지 않는 메서드에 static을 붙일 것을 고려한다.





클래스 멤버와 인스턴스 멤버간의 참조와 호출

  1. 같은 클래스내의 멤버들간에는 별도의 인스턴스 생성없이 서로 참조 또는 호출이 가능하지만, 클래스 멤버가 인스턴스 멤버를 참조 또는 호출하고자 하는 경우에는 인스턴스를 생성해야 한다.

    -> 그 이유는 인스턴스 멤버가 존재하는 시점에서 클래스 멤버는 항상 존재하지만, 클래스멤버가 존재하는 시점에서 인스턴스 멤버가 존재하지 않을 수 있기 때문이다.

  2. 마찬가지로 같은 클래스 내의 메서드는 서로 객체의 생성이나 참조변수없이 직접 호출이 가능하지만 static메서드는 인스턴스 메서드를 호출할 수 없다.
  3. 변수와 메서드간의 호출에도 마찬가지이다. 메서드간의 호출과 마찬가지로 인스턴스 메서드에서는 인스턴스 변수를 사용할 수 있지만, static메서드는 인스턴스 메서드를 사용할 수 없다.
  4. 하지만 인스턴스 멤버간의 호출에는 아무 문제가 없다. 하나의 인스턴스 멤버가 존재한다는 것은 인스턴스가 이미 생성되어있다는 것을 의미하며, 즉 다른 인스턴스 멤버들도 존재하기 때문이다.
profile
개발자

0개의 댓글