작성 : 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 |