[JAVA] chapter6 객체지향 프로그래밍 - 1

WOOK JONG KIM·2022년 9월 16일

자바의 정석

목록 보기
5/25
post-thumbnail

객체 지향 언어

  • 코드 재사용성

  • 코드 관리 용이

  • 중복 코드 제거

우선 프로그램을 기능적으로 완성 한 다음 어떻게 객체지향적으로 코드를 개선할 수 있을지 고민하는 것이 중요!

클래스

객체를 정의 해놓은 것

객체의 설계도

객체의 모든 속성(멤버변수)과 기능(메서드)이 정의되어 있음

클래스 선언

클래스명 변수명; // 클래스 객체를 참조하기 위한 참조 변수 선언

변수명 = new 클래스명() // 객체 생성 후 , 객체의 주소를 참조 변수에 저장

Tv t;

t = new Tv();
// new로 인해 TV클래스의 인스턴스가 메모리의 빈 공간에 생성

객체

실제로 존재하는 것

클래스에 정의된 내용대로 메모리에 생성 된 것

속성기능의 집합

클래스로 부터 객체를 만드는 과정 -> 클래스의 인스턴스화

만들어진 객체 -> 인스턴스

여러 클래스 작성

소스 파일의 이름은 public class의 이름과 일치해야한다.

public class가 없다면 소스파일의 이름은 소스파일 내 어떤 클래스 이름으로든 가능!

하나의 소스파일에 둘 이상의 public class 존재 하면 안된다!

객체 배열

Tv tv1, tv2, tv3; 
-> 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()}

객체 배열에는 객체가 저장되는 것 X, 주소가 저장

따라서 객체 배열 생성 후 객체를 각각 생성하여 저장해 주어야 함!

변수의 종류

class Variable
{
	int iv; // instance 변수
    static int cv; // class 변수(static or 공유 변수)
    
    void method()
    {
    	int lv = 0; //지역 변수
    }
}

인스턴스 변수 -> 객체마다 고유한 상태를 유지해야되는 경우 선언

클래스 변수 -> 독립적 저장공간X, 모든 인스턴스가 공통된 저장공간 공유

클래스이름.클래스 변수 와 같은 형식 가능

지역 변수 -> 메서드 및 반복문, 생성자 내에서만 사용되는 변수

호출 스택

메서드 수행에 필요한 메모리가 제공되는 공간

  1. 메서드가 호출되면 수행에 필요한 만큼 메모리를 스택에 할당 받는다.
  2. 메서드가 수행을 마치고나면 사용했던 메모리를 반환하고 스택에서 제거
  3. 호출 스택의 맨 위에 있는 메서드가 현재 실행중인 메서드
  4. 아래에 있는 메서드 == 바로 위의 메서드를 호출한 메서드


메호힙

메소드 영역(Method Area) :
클래스 정보클래스 변수가 저장되는 곳

호출 스택(Call Stack) :

메소드의 작업공간. 메소드가 호출되면 호출 스택에 메모리 할당, 종료되면 사용하던 메모리를 반환함

힙(Heap) :
인스턴스가 생성되는 공간. new연산자에 의해서 생성되는 배열과 객체는 모두 여기에 생성됨

매개변수

  • 기본형 매개변수(기본값) : 변수의 값을 읽기만 할 수 있다.

  • 참조형 매개변수(주소) : 변수의 값을 읽고 변경할 수 있다.

기본형 매개변수

class data1 
{
	int x;
}

class data
{
	public static void main(String[] args)
	{
		data1 d = new data1();
		d.x = 10;
		System.out.println("main() :x =" +d.x);
		
		change(d.x);
		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);
	}
}
main() :x =10
change() : x =1000
After change(d.x)
main() :x = 10

d.x의 값이 변경 된 것이 아니라 change 메서드의 매개변수 x의 값이 변경 된 것!!!!

-> 즉 원본에 영향 X

참조형 매개변수

class data1 
{
	int x;
}

class data
{
	public static void main(String[] args)
	{
		data1 d = new data1();
		d.x = 10;
		System.out.println("main() :x =" +d.x);
		
		change(d);
		System.out.println("After change(d.x)");
		System.out.println("main() :x = " + d.x);
		
	}
	
	static void change(data1 d)
	{
		d.x = 1000;
		System.out.println("change() : x =" +x);
	}
}
main() :x =10
change() : x =1000
After change(d.x)
main() :x = 1000

참조형 반환 타입

반환타입이 참조형이라는 것은 메서드가 객체의 주소를 반환한다는것을 의미

class data1 
{
	int x;
}

class data
{
	public static void main(String[] args)
	{
		data1 d = new data1();
		d.x = 10;
		
		data1 d2 = copy(d);
		System.out.println("d.x="+d.x);
		System.out.println("d2.x="+d2.x);
	}
	// 리턴값이 data객체의 주소 이므로 반환 타입이 data
	static data1 copy(data1 d)
	{
		data1 tmp = new data1();
		tmp.x = d.x;
		
		return tmp;
	}
}
profile
Journey for Backend Developer

0개의 댓글