본문 바로가기

개발 공부/Java

자바 프로그래밍 입문 강좌 11~17. JAVA 객체

자바 프로그래밍 입문 강좌 (renew ver.) - 초보부터 개발자 취업까지!!

 

11. 객체 지향 프로그래밍이란

11-1. 객체란?

세상에 존재하는 모든 것을 뜻하며 프로그래밍에서 속성과 기능을 가지는 프로그램 단위이다.

 

11-2. 클래스란?

객체를 생성하기 위한 툴로 모든 객체는 클래스로부터 생성된다.

 

11-3 클래스 구성 요소

속성(멤버 변수)와 기능(메서드)로 구성된다.

 

12. 클래스 제작과 객체 생성

 

12-1. 클래스 제작

package pjtTest;

public class Grandeur {
//일반적으로 클래스 이름 첫 글자는 대문자
	public String color;
	public String gear;
	public int price; //멤버 변수( 속성)
	
	public Grandeur() {
		System.out.println("Grandeur constructor");
	}//생성자
	
	public void run() {
		System.out.println("run -- ");
		
	}
	
	public void stop() {
		System.out.println("stop -- ");
	}
}
package pjtTest;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Grandeur myCar1 = new Grandeur();
		myCar1.color = "red";
		myCar1.gear = "auto";
		myCar1.price = 30000000;
		
		myCar1.run();
		myCar1.stop();
		
		Grandeur myCar2 = new Grandeur();
		myCar2.color = "blue";
		myCar2.gear = "auto";
		myCar2.price = 20000000;
		
		myCar2.run();
		myCar2.stop();
	}
}

12-3. 생성자

클래스에서 객체를 생성할 때 가장 먼저 호출된다.

 

 

13. 메서드

 

13-1. 메서드 선언과 호출

 

메서드도 변수와 같이 선언 및 정의 후 필요 시에 호출해서 사용한다.

package pjtTest;

public class ChildClass {
	public String name;
	public String gender;
	public int age;
	public ChildClass() {
		System.out.println("Child constructor");
	}
	
	public void getInfo() {
		System.out.println("--get info--");
		System.out.println("name : " + name);
		System.out.println("age : " + age);
	}
}
package pjtTest;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {

		ChildClass child1 = new ChildClass();
		child1.getInfo();
	}
}

package pjtTest;

public class ChildClass {
	public String name;
	public String gender;
	public int age;
	public ChildClass() {
		System.out.println("Child constructor");
	}
	
	public void getInfo() {
		System.out.println("--get info--");
		System.out.println("name : " + name);
		System.out.println("age : " + age);
		System.out.println("gender : " + gender);
	}
	
	public void setInfo(String n, String g, int a ) {
		System.out.println("--set info--");
		name = n;
		gender= g;
		age =a ;
	}
}
package pjtTest;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {

		ChildClass child1 = new ChildClass();
		child1.setInfo("hong gil dong", "m", 12);
		child1.getInfo();
	}
}

 

13-3. 중복 함수

public void getInfo(int x, int y)
{
	Systemout.println("f1");
}

public void getInfo(String s1, String s2)
{
 	System.out.println("f2");
}

같고 매개변수 개수 또는 타입이 다른 메서드를 만들 수 있다.

오버로딩이라고 한다.

 

 

 

13-4. 접근자

메서드를 호출할 때 접근자에 따라 호출이 불가할 수 있다.

public은 접근 가능, private는 불가능.

 

 

14. 객체와 메모리

 

14-1. 메모리에서 객체 생성(동적 생성)

- 객체는 메모리에서 동적으로 생성되며, 객체가 더 이상 필요없게 되면 GC에 의해 제거된다.

 

14-2. 레퍼런스

생성한 객체의 주소를 변수에 저장하는 것을 레퍼런스라고 한다.

package pjtTest;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		ObjectClass obj1 = new ObjectClass();
		ObjectClass obj2 = new ObjectClass();
		ObjectClass obj3 = new ObjectClass();
		
		System.out.println(obj1);
		System.out.println(obj2);
		System.out.println(obj3);
	}
}

 

14-4. null과 NullPointException

레퍼런스에 null이 저장되면 객체의 연결이 끊기며 더 이상 객체를 이용할 수 없다.

obj1= null;

처럼 null이 담긴 객체를 호출하면 NullPointException이 발생한다.

 

 

15. 생성자와 소멸자, 그리고 this 키워드

 

15-1. 객체가 생성될 때 가장 먼저 호출되는 생성자로 만약 개발자가 명시하지 않아도 컴파일 시점에 자동 생성된다.

 

package pjtTest;

public class ObjectClass {
	public ObjectClass() {
		System.out.println("Object Class()");
	}
}
package pjtTest;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		ObjectClass obj1 = new ObjectClass();
	}
}

 

생성자가 없어도 컴파일이 알아서 디폴트 생성자를 만든다.

 

15-2. 사용자 정의 생성자

매개변수를 넣을 수 있다.

 

package pjtTest;

public class ObjectClass {
	public ObjectClass() {
		System.out.println("Object Class()");
	}
	public ObjectClass(String s, int[] iArr) {
		System.out.println("User-defined constructor");
	}
}
package pjtTest;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		int[] iArr = {10, 20, 30};
		ObjectClass obj1 = new ObjectClass("Hello", iArr);
	}
	
}

15-3. 객체가 GC에 의해 메모리에서 제거될 때 finalize 메서드가 호출된다.

System.gc()를 사용한다고 해서 GC가 바로 작동하는 것은 아니라 가급적 빨리 작동하도록 요청하는 것

 

package pjtTest;

public class ObjectClass {
	public ObjectClass() {
		System.out.println("Object Class()");
	}
	public ObjectClass(String s) {
		System.out.println("User-defined constructor");
	}
	@Override
	protected void finalize() throws Throwable {
		System.out.println("-- finalize() --");
		super.finalize();
	}
}

15-4. 현재 객체를 가리킬 때 this를 사용

public ObjectEx(int i, String s, int is[]) {
	this.num = i;
    this.str = s;
    this.nums = is;
}

 

16. 패키지와 static

 

16-1. 패키지

java 프로그램은 많은 클래스로 구성되고 이러한 클래스를 폴더 형식으로 관리하는 것을 패키지라고 한다.

16-2. import문

다른 패키지에 있는 클래스를 사용하기 위해선 import 키워드 사용.

 

16-3. static

클래스의 속성과 메서드에 static을 사용하면 어디서나 속성과 메서드를 공유할 수 있다.

package pjtTest;

public class EmployeeBank {
	String name;
	static int amount = 0;
	
	public EmployeeBank(String name) {
		this.name = name;
	}
	
	public void saveMoney(int money) {
		amount+=money;
		System.out.println("amount : " + amount);
	}
	
	public void spendMoney(int money) {
		amount -= money;
		System.out.println("amount : " + amount);
	}
	
	public void getBankInfo() {
		System.out.println("Name : " + this.name);
		System.out.println("amount : " + amount);
	}
}
package pjtTest;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		EmployeeBank parkBank = new EmployeeBank("박찬호");
		parkBank.saveMoney(100);
		EmployeeBank leeBank = new EmployeeBank("이승엽");
		leeBank.spendMoney(30);
		
		parkBank.getBankInfo();
		leeBank.getBankInfo();
	}
	
}

 

17. 데이터 은닉

 

17-1. 멤버 변수의 private 설정

멤버 변수 = 속성은 주로 private로 설정해서 외부에서 데이터가 쉽게 변질되는 것을 막는다.

 

17-2. setter, getter

멤버 변수를 외부에서 변경할 수 있도록 한다.

 

package pjtTest;

public class Student {
	private String name;
	private int score;
	public Student(String n, int s) {
		this.name = n;
		this.score = s;
	}
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getScore() {
		return score;
	}

	public void setScore(int score) {
		this.score = score;
	}

	public void getInfo() {
		System.out.println("--getinfo()--");
		System.out.println("name : " + name);
		System.out.println("score : " + 90);
	}
}
package pjtTest;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Student std = new Student("홍길동", 90);
		std.getInfo();
		
		std.setScore(10);
		std.getInfo();
	}
	
}