작성 : 2024. 4. 6. 13:56

  • obsidian 사용법 알아보기

지난 시간동안 기본 문법을 다 배웠습니다. 앞으로는 예제를 수정하며 더 공부해보세요.

오늘은 클래스에 대해 배웁니다.

오늘 배운 내용이 자바에서 제일 중요한 내용!

  • 클래스

클래스(class) 란 객체를 정의하기 위한 틀, 설계도

이런 클래스를 가지고 여러 객체를 생성하여 사용.

중요한 키워드 : 관계! 클래스와 객체 사이 관계성을 가지고 프로그램이 동작함.

클래스 - 메인함수를 사용한 것 + 메인함수 사용 X = 같이 하나의 동작을 하게 됨

→ 원리

자바 = OOP (Object-Oriented Programming) = 객체지향프로그램

객체 : 유형, 무형의 사물들 , 현실에 존재하는 모든 것들을 코드화 할 수 있다..

// 클래스 함수에 들어가는 것들

public class Person {

 속성 : 눈, 코, 입, 팔, 다리, 머리카락, 이름, 나이, 주소, 신분 ...
 속성 - 문법적 형식으로 '변수' 사용
 
 게임의 캐릭터를 생각해보면 됨
 
 움직임을 표현할 수 있는 속성, 아닌 속성이 있음. 움직임을 표현하는 속성으로 나타낼 수 있는 것이 기능!
 기능 : 눈 깜박이기, 숨쉬기, 달리기 ...
 기능 - 문법적 특성 '메서드' 사용
 필요한 속성과 기능을 잘 골라내서 사용하기


 클래스 - '설계도'라고 함.
 어떤 것을 표현한 형태!
 인스턴스화
 
}

 

 

public class Tv {

// Tv에 대한 설계도 

// 티비의 속성 :
// 색상
String color;
// 전원버튼 (토글 형태 - boolean 을 씀)
boolean power;
// 채널
int channel;

// 속성들 중에 기능(변화가 생길 수 있는지)을 할 수 있는지 판단하고 기능을 메서드로 만들어줘야 함.
// Tv에서 기능 : 전원버튼, 채널

// 메서드 사용 예시
// 변수이름과 메서드는 형식으로 구분할 수 있어서 이름이 같아도 상관 없음.

// 전원
void power() {
	power = !power;
}

// 채널 버튼 올리고 내리고 두 개.
void channelUp() {
	channel++;
}

void channelDown() {
	channel--;
}

  // 이렇게 하면 Tv 에 대한 설계가 끝났다.
	// 여기까지 하면 정의만 한 것, 어떤 일도 일어나지 않음 
	// '객체의 생성'을 한 것! = 인스턴스화
	
}

 

public class TvTest {

public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 객체를 가지고 와서 실제로 동작시키는 역할을 함.
		
		// 객체를 생성 (메모리 로딩 - Tv 클래스에 있는 변수 3개와 메서드 3개 총 6개 할당)
		// 프로그램은 변수와 메서드를 사용하기 위해 메모리에 할당하는 역할을 하는 것!
		// 메모리를 할당하면 주소값을 가지게 됨.
		// new Tv(); // Tv를 만들었다 - 객체 생성
		// new __(); <- 주소값 
		// 이 주소값에 접근 하는 방법 new __() . <- 이 점을 통해 접근한다 ;
		// 예시 ) new Tv().channel;
		// 위와 같이 하면 일회성만 사용할 수 있음
		
		Tv t = new Tv(); // 객체 생성
		// t는 주소값을 가짐. t로 변수에 접근. 참조형 변수 -> 대문 주소만 알면 방은 다 접근할 수 있다
		// 해당클래스 이름이 타입이 됨. 
		// 클래스를 만들면 클래스 자체가 참조형을 만들 수 있는 타입이 됨. 
		
		t.color = "red"; // 맴버변수의 초기화 (초기화가 값을 설정해준다는 의미)
		t.power = true; 
		t.channel = 10; 
		
		System.out.println(t.channel);
		
		t.channelUp();  // 메서드의 호출 - 안에 있는 기능을 사용하겠다
		
		System.out.println(t.channel);  // 매서드가 작동됨! 객체를 정의하고 나서 안의 멤버를 생성해 할당, 변수나 메서드를 참조해 접근
		// 메서드 호출을 통해 사용하면 '동작'을 하게 됨.
		
		//-------------------------------------------------------------------------
		
		// Tv 설계도(클래스)가 있으니 똑같은 것을 여러 개 만들 수 있음
		
		Tv t2 = new Tv();
		// t 와 t2 는 다른 객체, 주소값이 다름 
		// 객체는 생성될 때마다 메모리에 값을 할당. 매번 새로운 객제가 만들어지는 것.
		
		t2.color = "blue";
		
		System.out.println(t2.color);
		// t2.color 가 변수명이 되는 것
		
		System.out.println(t.color);
		
		t2 = t; 
		// 이렇게 되면 t2 의 참조가 끊김 -> 자바 내부에서  G.C 실행, 오버플로우를 막기 위해.
		// 자바는 G.C가 하나 있기 때문에 이렇게 참조가 끊길 경우 실행이 오래 걸리게 됨. 
		// 웹은 해당 사항이 없지만 자바를 쓰기 때문에 G.C에 대해 알아보기.
		
		t2.color = "black";
		// t가 가리키는 것의 색이 바뀐 것.
		
		System.out.println(t.color);
		System.out.println(t2.color);
		// t가 할당받았던 곳의 주소값을 t2가 같이 참조한다는 것을 알 수 있음.
		
		System.out.println(t);  // 이렇게 하면 주소값을 알 수 있음. 
		System.out.println(t2); // t와 똑같은 주소값.
	}

}

 

 

  • 객체배열
public class Time {
// 객체배열

// 시계의 속성 : 시, 분, 초

// 시
private int hour; // 표현 가능 범위 : 0 ~ 23 객체를 구성할때 범위 이상 사용 못하도록 제어
// 분
private int minute; // 0 ~ 59
// 초
private float second; // 0 ~ 59

// private -> 제어
// private 때문에 접근 불가능힌 것을
// Gatter(읽기) / Satter(쓰기) 로 만들어 처리.
// Gatter / Satter 만들기

// 반드시 public 붙이고 대문자
public int getHour() {
	return hour;
}

// 반드시 public 붙이고 대문자 (변수명)
// 변수를 넣어줄 때 선언
public void setHour(int hour) {

	// 이 조건에 포함되지 않으면
	if (!(hour >= 0 && hour <= 23)) {
		return;
	}

	// 실행 X
	this.hour = hour;
}

public int getMinute() {
	return minute;
}

public void setMinute(int minute) {

	if (!(minute >= 0 && minute <= 59)) {
		System.out.println("범위를 벗어난 값입니다.");
		return;
	}

	this.minute = minute;
}

public float getSecond() {
	return second;
}

public void setSecond(float second) {

	if (!(second >= 0 && second <= 59)) {
		System.out.println("범위를 벗어난 값입니다.");
		return;
	}

	this.second = second;
}

(앞으로 더 자세히 배울 예정)

private → 접근 제한자

 

  • 접근 제한자

public : 제한 없이 모든 패키지, 모든 클래스에서 가능

protected : 같은 패키지 안에서 사용 가능, 다른 패키지라도 자식 클래스라면 접근가능

default : 같은 패키지 내에서만 접근 가능

private : 같은 클래스 내에서만 접근 가능

접근 범위가 넓은 쪽에서 좁은 쪽

public < protected < default < private

 

public class TimeTest {
	
	// 생성을 위한 메인함수
	public static void main(String[] args) {
		// TODO Auto-generated method stub

//		Time t1, t2, t3; 
//		// 동일한 타입의 변수가 세 개를 사용할 때는 위와 같은 형태보다 배열을 사용하는 것이 효과적! 
//		
//		t1 = new Time();
//		t2 = new Time();
//		t3 = new Time();
		
//		t1.hour = 12;
//		t1.minute = 10;
//		t1.second = 34;
//		
//		t2.hour = 6;
//		t2.minute = 30;
//		t2.second = 54;
//		
//		t3.hour = 3;
//		t3.minute = 23;
//		t3.second = 45;

		
		// 객체의 배열
		// 배열은 인덱스 번호 포함된 것까지가 변수 
		Time[] t = new Time[3];
		
		t[0] = new Time();
		t[1] = new Time();
		t[2] = new Time();
		
		t[0].setHour(12);
		t[0].setMinute(56);
		t[0].setSecond(22);
		System.out.println(t[0].getHour());
		System.out.println(t[0].getMinute());
		System.out.println(t[0].getSecond());
		// 가로 안의 값이 Time 클래스로 넘어감.
		
//		t[0].hour = 12;
//		t[0].minute = 10;
//		t[0].second = 34;
//		
//		t[1].hour = 1;
//		t[1].minute = 11;
//		t[1].second = 34;
//		
//		t[2].hour = 2;
//		t[2].minute = 9;
//		t[2].second = 19;
//		
//		t[3].hour = 7;
//		t[3].minute = 27;
//		t[3].second = 36;
		
		
	}

}

 

수월한 getter, setter 생성을 위해 lombok 이라는 라이브러리를 추천.

lombok 설치 (완.)

  • lombok 이용 방법 알아보기
  • 공식사이트 가서 알아보기
  • 자바에서 클래스를 사용한다는 것은 메모리값을 활용하는 것.

 

public class Card {

// 맴버 변수 (class) 에는
// 자동초기화
// 인스턴스 변수, - 반드시 생성 후에 사용
// 클래스 변수 두 가지가 있다.
// 클래스 변수 - 1. 생성없이 사용 가능 (앞에 static를 붙임.)
//            2. 변수가 공유 된다.


int iv; // 인스턴스 변수
static int cv; // 클래스 변수

// 클래스 영역에는 for문을 쓸 수 없다.
// 클래스 안에 다른 형태의 블록을 만들어서 for문, if문 등 사용 -> 메서드
// 메서드를 만들고 그 안에 코드를 넣어 사용
// 모든 영역을 메서드로 구성해 동작 -> 자바

// 트럼프카드 (서양카드)

// 카드의 속성 : 숫자, 모양(무늬), 색, 조커유무, 영어알파벳(A), 크기 등등
// 인스턴스 변수
String kind; // 무늬
int number; // 숫자
static int width = 100; // 폭
static int height = 200; // 높이
// 폭과 높이는 클래스 변수로,, 고정된 값이기 때문에!

}
public class CardTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		// 클래스를 구성하는 요소 - 변수와 메서드!
		
//		System.out.println(Card.cv);
//		//                 소속클래스명 = 이 자체가 생성을 의미한다.
//		
//		Card c = new Card();
//		System.out.println(c.iv);
//		System.out.println(c.cv);
		
		Card c1 = new Card();
		Card c2 = new Card();
		
		c1.kind = "Hart";
		c1.number = 10;
		
		c2.kind = "space";
		c2.number = 20;
		
		System.out.println(c1.kind + " : " + c1.number); // 결과 : Hart : 10
		System.out.println(c1.width); // 결과 : 100
		System.out.println(c2.height); // 결과 : 200
		System.out.println(c2.kind + " : " + c2.number); // 결과 : space : 20

		c1.iv = 10;
		c2.iv = 20;

		System.out.println(c1.iv); // 결과 : 10
		System.out.println(c2.iv); // 결과 : 20

		// 각각의 독립된 변수

		c1.cv = 30;

		System.out.println(c1.cv);  // 결과 : 30 
		System.out.println(c2.cv);  // 결과 : 30

		c2.cv = 100;

		System.out.println(c1.cv);  // 결과 : 100
		System.out.println(c2.cv);  // 결과 : 100
		// 변수는 공유되어진다는 것을 알 수 있음

	}

}

 

public class Function {
	// 클래스는 변수와 메서드만 작성
	// 메서드에 대해 알아봅니다.
	// 메세지 교환 방식

	// 메서드 힙 영역에서 한번만 할당
	// 메서드는 데이터를 주고 받음.

	// 리턴타입 메서드명([매개변수]) { <- [ ] 표시 - 어떤 경우에는 쓰고 어떤 경우에는 안쓰는 것을 판단해서 써야함.
	// 실행문;
	// [return;] <- 리턴타입이 void 의 경우 생략한다.
	// }

	// 함수 정의 - 속성을 이용해 기능 표현

	// 리턴타입 : 기본형, 참조형, void (세 가지 중 하나 사용)

	// 매개변수 사용 X
	void add() {
		System.out.println(2 + 3);
	}

	// 매개변수 사용
	// 매개변수는 지역변수
	void add2(int x, int y) { // x = 10 , y = 20
		System.out.println(x + y);
	}

	void add3(int x, int y) {
		int sum = x + y;
	}

	// 돌려받으려는 값의 타입 적어줘야함.
	int add4(int x, int y) {
		int sum = x + y;
		return sum; // 확인하는 역할의 return
	}

	// return 구문을 쓸 때 특징
	// 꼭 값을 돌려줄 때 쓰는 게 아님!

	void add5(int x) {
		if (x >= 10) {
			System.out.println("return문에 의한 종료");
			return; // 메서드 강제종료 = 조건이 맞으면 종료한다.
			// void 타입에서는 return을 쓸 수 없지만 조건문의 강제종료를 위해 사용가능
		}

		System.out.println(x); // 위 조건에 만족하지 않으면 해당 코드가 실행됨.
	}

	int add6(int x, int y) {
//		if (x > y) {
//			return x;  // 반대조건에 대해서도 리턴해줘야 함.
//		} else {
//			return y;
//		}

		// 위 코드와 같은 의미

		if (x > y) {
			return x;
		}
		
		return y; // 간략한 표현
	}
	
	// 매개변수의 타입에 따른 분류
	// call by value (기본형) : 값의 복사
	// call by reference (참조형 (주소값)) : 클래스명, 배열
	
	
	// ' call by value (기본형) : 값의 복사 ' 를 사용한 매개변수 사용
	void add(int x, int y) {
		
		System.out.println(x);
		System.out.println(y);
		
		x = 100;
		y = 200;
		
		System.out.println(x + y);
	}
	
	// ' call by reference (참조형 (주소값)) '
	// 다음 시간에..

}
public class FunctionTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// Function 클래스 생성

		Function f = new Function();

		// 함수를 사용하는 방법
		f.add(); // = 메소드의 호출
		f.add2(10, 20);
		f.add3(100, 200);
		// f.add4(5, 6); **** class에 있는 return으로 돌려받는 값이 됨.
		System.out.println(f.add4(5, 6));
		// Function 클래스에 있는 sum 과는 다른 sum
		int sum = f.add4(9, 8);
		System.out.println(sum);

		f.add5(3);
		f.add5(11);
		int max = f.add6(10, 50);
		System.out.println(max);
		
		
		// Function 클래스의 x, y와는 다른 값
		int	x = 10;
		int y = 20;
		
		f.add(x, y);
		
		System.out.println(x);
		System.out.println(y);
	}

}

'2024_UIUX 국비 TIL' 카테고리의 다른 글

UIUX _국비과정 0409  (0) 2024.05.29
UIUX _국비과정 0408  (0) 2024.05.29
UIUX _국비과정 0404  (0) 2024.05.29
UIUX _국비과정 0403  (0) 2024.05.29
UIUX _국비과정 0402  (0) 2024.05.29

+ Recent posts