클래스와 객체

codakcodak·2023년 7월 18일
0

Java

목록 보기
8/17
post-thumbnail

객체지향의 특징

객체

  • 클래스에서 정의한 것을 토대로 메모리(실제 저장공간)에 할당된 것으로, 프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간

특징

1. 추상화

  • 현실의 객체를 추상화해서 클래스를 구성한다.

2. 다형성

  • 하나의 객체를 여러 가지 타입으로 참조할 수 있다.

3. 상속

  • 부모 클래스의 자산을 물려받아 자식을 정의함으로 코드의 재사용이 가능하다.

4. 데이터은 닉과 보호

  • 데이터를 외부에 직접 노출시키지 않고 메서드를 이용해 보호할 수 있다.

추상화와 구체화

추상화

  • 공통적인 속성과 기능을 정의함으로써 코드의 중복을 줄이고, 클래스 간 관계를 효과적으로 설정하고, 유지/보수를 용이하게 하는 것
  • 클래스간의 공통점을 찾아내서 공통의 조상을 만드는 작업
abstract class Unit{
    int x, y;
    abstract void move(int x, int y);
    void stop(){ /*멈추기*/ };

*유닛의 공통적인 특징 및 행동을 정의

구체화

  • 상속을 통해 클래스를 구현, 확장하는 작업
class Marine extends Unit{
    void move(int x, int y){
        /* 이동하기 구현 */
    }
    void attack(){
        /* 공격하기 구현 */
    };
}

*상속을 통해 공통적인 행동양식을 상속받고 Marine에 대한 구체적인 구현

클래스

  • 객체를 정의해 놓은 것
  • 객체를 만들기 위한 틀
class Tv {
    // 속성(변수)
    String color; 
    boolean power; 
    int channel;

    // 기능(메서드)
    void power() { power = !power; }
    void channelUp() { channel++; }
    void channelDown() { channel--; }

변수

public class Person {
	String name;//인스턴스 변수
	int age;
    
    static int count;//클래스 변수
	
	public void eat(int input//파라미터 변수) {
    	int number=10;//지역변수
		System.out.println("배고파");
	}
	public void work() {
		System.out.println("힘들어");
	}
}

인스턴스 변수

public class PersonTest {
	public static void main(String[] args) {
		Person person1=new Person();
		person1.name="kim";
		System.out.println(person1.name);
	}
}
  • 객체를 생성 후 객체의 이름으로 접근한다.
  • 인스터스 변수는 지역변수와 다르게 초기화를 안해도 자동으로 초기화가 이루어진다.

클래스 변수

public class PersonTest {
	public static void main(String[] args) {
		System.out.println(Person.count);
	}
}
  • 클래스의 이름을 통해 접근한다.
  • 클래스 로더에 의해 클래스가 로딩될 때 heap에 클래스 별로 생성된다.

지역 변수 & 파라미터 변스

public class PersonTest {

	public static void main(String[] args) {
		int num;
		num=10;
		System.out.print(num);
	}
}
  • 외부에서는 접근할 수 없다.
  • 사용하기 전 명시적 초기화가 필요하다.

메서드

//Person.java
public class Person {
	String name;
	int age;
	boolean isHungry;
	static int count;
	
	public void printInfo() {
		System.out.println("name"+"age");
	}
	public static void printInfoStatic() {
		System.out.println("name,age를 가진 학생입니다.");
	}
}
//PersonTest.java
public class PersonTest {
	public static void main(String[] args) {
		Person p1=new Person();
		p1.printInfo();
		Person.printInfoStatic();
	}
}
  • 객체의 동작을 함수화한 것
  • 인스턴스 메서드를 호출할 땐 생성된 객체로 접근한다.
  • 클래스 메서드를 호출할 땐 클래스 이름으로 접근한다.

*클래스 메서드는 메서드 로딩시 메모리에 생성되므로 인스턴스 변수를 사용할 수 없다.인스턴스 변수를 사용하려면 객체를 생성 후 사용해야한다.

오버로딩

//Person.java
public class Person {
	String name;
	int age;
	boolean isHungry;
	static int count;
	
	public void printInfo() {
		System.out.println("name"+"age");
	}
	public static void printInfoStatic() {
		System.out.println("name,age를 가진 학생입니다.");
	}
	public void walk() {
		System.out.println("걷다");
	}
	public void walk(int distance) {
		System.out.println(distance+"m를 걷다");
	}
}
public class PersonTest {
	public static void main(String[] args) {
		Person p1=new Person();
		p1.walk();
		p1.walk(10);
	}
}
걷다
10m를 걷다
  • 동일한 기능을 수행하는 메서드의 추가 작성
  • 파라미터의 개수 또는 순서,타입이 달라야한다.

생성자

  • 클래스와 이름이 동일하다.
  • 반환형태가 없어야 한다.

1. 기본 생성자

public class Person {
	String name;
	int age;
	boolean isHungry;
	
	//public Person() {컴파일러가 자동으로 삽입
	//}
	
	public Person(String name, int age, boolean isHungry) {//해당 파라미터를 줬을 때 적용된다.
		super();
		this.name = name;
		this.age = age;
		this.isHungry = isHungry;
	}
}

1. 사용자 정의 생성자

public class Person {
	String name;
	int age;
	boolean isHungry;
	
	public Person(String name, int age, boolean isHungry) {//해당 파라미터를 줬을 때 적용된다.
		super();
		this.name = name;
		this.age = age;
		this.isHungry = isHungry;
	}
}

this

public class Person {
	String name;
	static int count;

	public Person() {
//    	this.name="홍길동" 아래의 this가 둘째줄이 되기 때문에 오류가 난다.
		this("홍길동");//this를 통해 아래의 기본생성자로 다시 한번 초기화 가능+기본생성자의 첫번째 줄에만 써야한다.
	}

	public Person(String name) {
		this.name=name;
	}

//	public static int getCount(){ 스태틱 영역에서 this는 사용이 불가능하다.
//		return this.count;
//	}
	public int getCount() {//자기 자신의 count 반환
		return this.count;
	}
}
  • 참조변수로써 개체 자신을 가르킨다.
  • 자신의 멤버변수로의 접근이 가능하다.
  • 객체를 가르키기 때문에 스태틱 영역에서는 사용이 불가능하다.
  • 기본생성자에서 다른 기본생성자로 초기화 시킬 수 있다.(기본생성자의 첫번째 줄에만 써야함)
profile
숲을 보는 코더

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

잘 봤습니다. 좋은 글 감사합니다.

답글 달기