[24.09.06] TIL

yy·2024년 9월 5일

개발일지

목록 보기
95/122

JAVA 공부

객체

프로그래밍에서 속성과 기능을 갖는 프로그램 단위.
예시로 살펴보는게 더 확실히 와닿음.

예)

  • 속성 : 신축성, 재료 등
  • 기능 : 보온, 디자인 등

자동차

  • 속성 : 바퀴, 엔진 등
  • 기능 : 이동, 운반 등

날씨예보프로그램

  • 속성 : 날짜, 기후, 기단 등
  • 기능 : 현재 날씨 정보, 날씨예측 등


클래스

객체를 생성하기 위한 틀. 모든 객체는 클래스로부터 시작됨. (붕어빵틀)
클래스의 구성요소 : 속성(멤버변수), 기능(메소드)

클래스 { 멤버변수, 메소드, 생성자 등으로 구성 }

클래스 대문자 시작

맴버변수 = 변수

메소드 = 함수

생성자 : 클래스 이름과 동일한 메소드. 외부에서 이 클래스에 접근해서 사용할 때 생성자를 사용하기 위함임. 생성 시 내용이 있어야한다면 생성자 중괄호 안에 넣으면 됨.

클래스로 부터 객체를 생성하기 위해서는 new 를 사용해서 클래스를 불러 객체를 생성해준다.
main 클래스에서는 main method를 만들어서 그 안에 코드를 넣어야함.
생성자를 여러개 둬서 객체를 다양하게 만들 수 있음.

// MainClass.java
package pjTest;

public class MainClass {
	public static void main(String[] args) {
		Grandeur myCar1 = new Grandeur();
		myCar1.color = "red";
		myCar1.gear = "auto";
		myCar1.price = 300;
		
		myCar1.run();
		myCar1.stop();
		myCar1.info();
		

		Bicycle myBicycle1 = new Bicycle("blue", 100);
		
		myBicycle1.color = "black";
		
		myBicycle1.info();
	}
}
//Grandeur.java
package pjTest;

public class Grandeur {
	public String color;
	public String gear;
	public int price;
	
	public Grandeur() {
	System.out.println("Grandeur 생성자");
	}
	
	public void run() {
		System.out.println("run");
	}
	
	public void stop() {
		System.out.println("stop");
	}
	
	public void info() {
		System.out.println("--info--");
		System.out.println("color: " + color);
		System.out.println("gear: " + gear);
		System.out.println("price: " + price);
	}
}
//Bycicle.java
package pjTest;

public class Bicycle {
	public String color;
	public int price;
	
	public Bicycle() {
		System.out.println("Bicycle 생성자1");
	}
	
	public Bicycle(String a, int b) {
		System.out.println("Bicycle 생성자2");
		color = a;
		price = b;
	}
	
	public void info() {
		System.out.println("--info--");
		System.out.println("color: " + color);
		System.out.println("price: " + price);
	}
}
  • 중복 메소드(overloading) : 메소드 이름은 같고, 매개변수(파라미터)를 다르게 사용하는 메소드

  • 접근자 : 메소드 호출 시 접근자 사용에 따라 호출 가능, 불가능할 수 있음.
    -> public(공개), private(비공개_내부에서만 사용 가능)

레퍼런스

  • Child child = new Child(); // 이때 child는 레퍼런스.
  • 레퍼런스는 객체가 들어있는 메모리의 그 주소를 가르키고 있음. 생성한 객체의 주소를 변수에 저장하는 것.
  • 클래스로 객체를 만들면 각각 다른 객체와 레퍼런스가 만들어진다. 같은 클래스로 객체를 만들었다고 같은 레퍼런스가 아니라는 말임.

  • 자료형이 같아도 다른 공간이 존재하는 객체는 다른 객체임.

  • 레퍼런스에 null 저장되면 객체의 연결이 끊기며, 더 이상 객체를 이용할 수 없음. -> nullpoint exception이 뜸

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

		ObjectClass object1 = new ObjectClass();
		ObjectClass object2 = new ObjectClass();
		
		object1.getInfo();
		
		object1 = null;
		
		object1.getInfo();	//Exception in thread "main" 에러발생	
		
	}
}

생성자

디폴트 생성자

  • 객체가 생성될 때 가장 먼저 호출되는 생성자. 만약 개발자가 작성하지 않았어도 컴파일 시점에 자동 생성됨.
	public ObjectClass() {
	}


사용자 정의 생성자

  • 디폴트 생성자 외의 특정 목적에 의해서 개발자가 만든 생성자. 매개변수에서 디폴트 생성자와 차이가 있음
	public ObjectClass(String n, int[] iArr) {
	}


소멸자

객체가 GC에 의해서 메모리에서 제거될 때 finalize() 메소드가 호출됨.

System.gc(); // GC호출코드. 이걸 사용한다고 해서 GC가 바로 작동하는 것은 아니고, 가급적 빨리 작동하도록 하는 명령어임.



this 키워드

지역변수: 국부적으로 사용되는 변수

전역변수: 코드 전체에서 사용되는 변수 (this를 사용해서 해당 객체의 변수인(=전역변수)를 가르킴.)



패키지

클래스를 폴더 형식으로 관리하는 것

  • 패키지 이름 결정 요령

    	- 패키지 이름은 패키지에 속해있는 클래스가 최대한 다른 클래스와 중복되는 것을 방지하도록 만듦
    
    	- 패키지 이름은 일반적으로 도메인을 거꾸로 이용(ex) com.java.employee)
    
    	- 개발 중 패키지의 이름과 구조는 변경가능
    
    	- 패키지 이름만 보고도 해당 패키지 안에 있는 클래스가 어떤 속성과 기능을 가지고 있는지 예상가능토록 만듦


import

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

같은 패키지에 있는 클래스는 그냥 사용하면 됨.

import com.java.daliyJournal.*; // 해당 경로 다 불러오기



static

클래스의 속성과 메소드에 static 키워드를 사용하면 어디서나 속성과 메소드를 공유할 수 있음.
동일 클래스에서 생성된 객체끼리 속성, 메소드를 공유할 수 있게 함.



데이터 은닉

멤버변수의 private 설정

멤버 변수(속성)는 주로 private으로 설정해서, 외부로부터 데이터가 변질되는 것을 막음.



setter, getter

멤버 변수를 외부에서 변경할 수 있도록 하는 메소드.

오른쪽 마우스 클릭 - source 사용하여 자동완성으로 만들 수 있음.

단순히 객체.속성 = 변경사항이 아닌 public 메소드를 이용해서 변경하도록 하는 방법임. (메소드에 조건을 달아서 안전장치를 만들 수 있음)



상속

부모 클래스를 상속받은 자식 클래스는 부모 클래스의 속성, 기능 사용 가능. ( 단일 상속만 지원. 하나의 클래스는 하나의 클래스만 상속 가능. )

parent class (속성1, 기능1)

child class (속성1, 기능1, 속성2, 기능2)

구현

extends 키워드를 이용해서 상속 구현

자식 클래스 호출 시 부모 클래스 생성자 호출 되고 자식 클래스 생성자가 호출됨.

public class ChildClass extends ParentClass{
}

자식 클래스는 부모 클래스의 모든 자원 사용가능하지만, private접근자의 속성, 메소드 사용 불가

상속 특징

메소드 오버라이드

부모클래스의 기능(메소드)을 자식 클래스에서 재정의해서 사용.

부모클래스의 메소드를 복사해 가져와서 다시 작성할 수 있음. 알아보기쉽게 어노테이션(@Override)를 달아주면 보기 좋음.

기본 자료형처럼 클래스도 자료형이다.

package pjTest;

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

		ParentClass childs[] = new ParentClass[2];
		
		childs[0] = new FirstChildClass();
		childs[1] = new SecondChildClass();
		
		for (int i = 0; i < childs.length; i++) {
			childs[i].makeJJajang();
		}
	}
}
package pjTest;

public class ParentClass {
	public ParentClass() {
		System.out.println("--ParentClass--");
	}
	
	public void makeJJajang() {
		System.out.println("--parentMakeJJajang--");
	}
}
package pjTest;

public class FirstChildClass extends ParentClass{
	public FirstChildClass() {
		System.out.println("--FirstChildClass--");
	}
	
	@Override
	public void makeJJajang() {
		System.out.println("--1firstChildMakeJJajang--");
	}
}
package pjTest;

public class SecondChildClass extends ParentClass{
	public SecondChildClass() {
		System.out.println("--SecondChildClass--");
	}
	
	@Override
	public void makeJJajang() {
		System.out.println("--2secondChildMakeJJajang--");
	}
}
--ParentClass--
--FirstChildClass--
--ParentClass--
--SecondChildClass--
--1firstChildMakeJJajang--
--2secondChildMakeJJajang--


object 클래스

모든 클래스의 최상위 클래스는 object 클래스.
컨트롤 + t 누르면 상위 계층을 볼 수 있음.



super 클래스

상위클래스를 호출할 때 super키워드를 이용.

public void getOpenYear() {
    system.out.println("ChildClass" + this.openYear) //현재 클래스의 openYear 호출
    system.out.println("ParentClass" + super.openYear) // 상위클래스에 있는 openYear호출
}


내부클래스

클래스 안에 또 다른 클래스를 선언하는 것으로 두 클래스의 멤버에 쉽게 접근 가능. (잘안씀)

익명클래스

이름이 없는 클래스로 주로 메소드를 재정의하는 목적으로 사용.
한번만 사용하고 버릴 생각으로 만드는 클래스.
인터페이스나 추상클래스에서 사용되는 클래스.

package lec20Pjt001;

public class AnonymousClass {
	public AnonymousClass() {
		System.out.println("AnonymousClass constructor");
	}
	public void method() {
		System.out.println(" -- AnonymousClass's method START -- ");
	}
}
new AnonymousClass() {

	@Override
	public void method() {
		System.out.println(" -- AnonymousClass's Override method START -- ");
};
}.method();
profile
시간이 걸릴 뿐 내가 못할 건 없다.

0개의 댓글