- 자바(Java)는 클래스이다! 해도 과언이 아닌 만큼 굉장히 중요한 파트이다.
오늘은 클래스의 기초를 배운다. 추후에 클래스에 대해 다시 깊이 다룰 것이다.
- 데이터를 추상화시켜 속성과 행위를 가진 객체를 만들고
그 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법
▶ 우리가 표현할 수 있는 실제 세계의 모든 사물들을 객체(오브젝트Object) 라고 한다.
▶ 객체 만들기를 인스턴스(Instance)화 한다.
- 자바(JAVA)는 클래스가 전부이다.
- 클래스는 데이터와 처리동작을 하나로 모아놓은 것이다.
- 데이터를 필드, 처리동작을 메소드라고 한다.
- 필드와 메서드를 클래스의 멤버라고 한다.
- ★★ 객체지향 프로그래밍에서는 큰 하나의 클래스보다
작은 열개의 클래스가 더 큰 힘과 위력을 발휘한다.
========== 규칙 ==========
- 클래스 이름은 대문자로 시작
- 하나의 java파일에 여러개의 클래스를 정의 가능하다
- 단, 소스 파일 1개당 public 클래스 선언은 단 하나만 가능하다.
- 자바 파일명과 public 클래스명은 동일해야함 and 패키지는 폴더명과 일치
Book(클래스 타입) myBook 주소값(참조값) = new (객체생성) Book(); (생성자)
- 생성자(constructor)란 객체 생성을 할 때만 호출하는 특수한 메서드
- 생성자 이름은 클래스 이름하고 똑같다.
- 메소드이지만 반환형이 없는 형태이다.
⚡ 디폴트 생성자(Default Constructor)
- 클래스는 반드시 하나 이상의 생성자가 존재
- 개발자가 생성자를 정의하지 않으면 컴파일러에 의해 디폴트 생성자가 코드에 삽입
- 매개변수와 실행부가 없는 형태로 정의
- 변수나 메서드에 접근 제한자를 지정하면 접근을 제한할 수 있다.
- 데이터의 안정을 위해 // 권한이 있는 사람만 볼 수 있다
정보은닉화(private)을 많이 사용한다.
단, 정보은닉화를 하게 되면 메소드 호출할시 getter(출력) setter(입력)을 만들어서
간접으로 호출해야 한다.
💧 getter & setter 생성법
get set은 우클릭 - source - general getter and setter로 자동 생성 가능
변수마다 이름을 각각 정의하는 것은 생각보다 쉽지 않다. 그래서
보통은 같은 이름을 사용하는데 멤버변수임을 구분해주는 데 this를 사용한다.
main > 번호 줄 우크릭 > toggle breakpoint
ㄴ 오류 체크할 때 좋다
ㄴ 다음줄 넘어가는 것 (Step over)
ㄴ 메소드 안으로 들어가는 것 (Step into)
- 스태틱 영역의 변수 및 메서드는 어떤 객체에서도 접근해서 사용할 수 있다.
- 그래서 스태틱을 전역변수라고도 불리운다.
- main 보다도 먼저 실행된다.
- 하나만 선언이 가능하다.
- 특정 기능이 필요한데 자주 사용된다면 많은 클래스에서 중복되어 만들어 지지 않게 하려는 의도에서 스태틱을 많이 사용한다. .
- 스태틱(static)의 특징
- 메모리에 고정적으로 할당된다.
- 객체 생성 없이 사용할 수 있다.
- 프로그램이 시작되면 메모리의 static 영역에 적재되고, 프로그램이 종료될 때 해제된다.
- Static 메서드 내에서는 인스턴스 변수를 사용할 수 없다.
- JVM(자바 가상 머신)이 클래스를 실행시키는 방법
ㄴ같은 폴더에서 클래스 파일을 찾아서 기억한다.
ㄴ경로를 지정했다면 그 경로에 있는 클래스 파일을 찾아서 실행한다.
ㄴJava.class - 실행(확장자가 class여야 실행이 가능하다.)- 패키지는 폴더명과 같다.(폴더 이름은 소문자로 구성한다)
ㄴ .은 안에 있는 폴더를 의미한다. 예시) com.study- 클래스패스는 자바 가상머신의 클래스 탐색 경로를 의미한다.
- java.lang 패키지만 예외적으로 임포트가 필요 없이, 클래스 이름만 적어서 사용할 수 있다.
- 클래스 이름이 같아서 충돌이 일어나는 경우가 아니라면 왠만하면 import해서 사용한다.
cmd (명령 프롬프트) 기초 명령어
1. cd + "주소" : cd는 들어간다를 의미한다.
2. dir : 목록 보기
- 밑변과 높이 정보를 저장할 수 있는 Triangle클래스를 정의해보자.
init메소드를 통해 밑변과 높이를 초기화한다.
그리고 밑변과 높이를 변경시킬수 있는 메소드와 삼각형의 넓이를 계산해서 반환하는 메소드도 함께 정의해보자.- 구슬치기 하는 아이들을 추상화하여 클래스로 정의해보자.
어린아이가 보유하고 있는 구슬의 개수 정보를 담는다
놀이를 통해 구슬을 획득 또는 상실하는 것을 표현한다.
*어린이의 현재 보유하고 있는 구슬의 개수를 표현한다.
초기화는 다음과 같이 진행한다.
◆어린이1의 보유갯수 : 구슬 20개
◆어린이2의 보유갯수 : 구슬 15개
게임은 다음과 같이 진행한다.
◆1차게임 : 어린이1은 어린이2의 구슬 5개를 획득한다.
◆2차게임 : 어린이2는 어린이1의 구슬 9개를 획득한다.
ㄴ어린이 객체를 생성시 구슬의 보유갯수는 생성자를 통해 초기화 되어야 한다.- 성적 클래스를 작성해보자. 국어,영어, 수학 과목의 3개의 점수를 입력받아
객체를 생성하고 성적 평균을 출력하는 프로그램을 만들어라.
import java.util.Scanner;
class Triangle
{
//멤버변수 : 밑변, 높이
/*
멤버변수의 직접적인 접근을 차단하기 위해 private으로 선언하는 것을
정보은닉이라고 한다
*/
private int bottom;
private int height;
//멤버 메서드
//멤버 변수 전체를 초기화 한다
public void init(int _bottom, int height)
{ // private을 간접적으로 불러오기 위해 해당 메소드를 만든다
//매개변수와 멤버변수명이 다르므로 혼선이 없기에 this가 없어도 된다
bottom = _bottom;
//this는 멤버변수를 가리키는 키워드이다. height은
//Triangle의 멤버변수와 일치하기에 this를 붙여서 구분해준다.
this.height = height;
}
// 우클릭 소스 - getter, setter를 누른다 - setter만 생성한다.
// private이므로 간접적으로 접근하기 위해 필요하다.
public void setBottom(int bottom)
{
this.bottom = bottom;
}
public void setHeight(int height)
{
this.height = height;
}
/*
삼각형의 넓이는 밑변*높이*0.5 이므로 계산의 결과가 소수점으로 나올 수 있다
따라서 int가 아닌 double형으로 설정해주어야 한다.
*/
public double getArea(int bottom2, int height2)
{
return bottom2 * height2 * 0.5;
}
}
public class ClassOne
{
public static void main(String[] args)
{
/*
1. 밑변과 높이 정보를 저장할 수 있는 Triangle클래스를 정의해보자.
init메소드를 통해 밑변과 높이를 초기화한다.
*/
Triangle t = new Triangle(); //Triangle을 불러와준다. t라는 객체로 담는다.
Scanner scan = new Scanner(System.in); // 사용자로부터 입력값을 받는다.
System.out.println("밑변은 몇인가요? : ");
int bottom = scan.nextInt(); // bottom(밑변)으로 저장
System.out.println("높이은 몇인가요? : ");
int height = scan.nextInt(); // height(높이)로 저장
t.getArea(bottom, height); // t클래스 객체에 포함된 getArea를 호출해서 밑변과 높이를 보낸다.
System.out.println("삼각형의 넓이 : "+ t.getArea(bottom, height));
System.out.println("임의로 변경한 값의 삼각형 넓이 : "+ t.getArea(5, 10));
}
}
class gusle
{
// 멤버변수 : 어린이가 보유한 구슬의 개수
int bead;
// 멤버 변수를 초기화 할 목적으로 정의한다.
public gusle(int bead) // 생성자, 매개변수 1개 있는 생성자 ( 이름 같으면 )
{
// this는 멤버변수와 매개변수
this.bead = bead; // 멤버변수 안에 매개변수를 넣는다
/*
this의 활용법
1. 해당 클래스의 멤버를 가리킬때 사용한다
2. 오버로딩으로 정의된 또 다른 생성자를 호출할 때 사용한다
이 때는 this(인수1, 인수2)와 같이 기술한다
*/
}
// 어린이가 보유한 구슬의 개수를 출력한다
public void showProperty()
{
System.out.println("보유한 구슬의 개수 : " + bead);
}
/*
구슬게임을 위한 멤버 메소드
▶ 구슬의 총 개수는 한정적이므로 한 사람이 잃으면 한 사람은 얻게 되어 있다.
*/
public void obtainBead(gusle child, int beadCount)
{
// this는 객체 자신이 되므로, 호출의 주체는 구슬이 증가한다.
this.bead += beadCount; // 한 아이가 구슬을 얻으면
// 매개변수로 전달된 어린이의 구슬은 잃게 되므로 .(닷)으로 접근
//하여 잃게 하면 된다
child.bead -= beadCount; // 다른 아이는 구슬을 잃는다
}
}
public class ClassTwo
{
public static void main(String[] args)
{
// 2. 구슬치기 하는 아이들을 추상화하여 클래스로 정의해보자.
// *어린아이가 보유하고 있는 구슬의 개수 정보를 담는다
// *놀이를 통해 구슬을 획득 또는 상실하는 것을 표현한다.
// *어린이의 현재 보유하고 있는 구슬의 개수를 표현한다.
// 초기화는 다음과 같이 진행한다.
// ◆어린이1의 보유갯수 : 구슬 20개
// ◆어린이2의 보유갯수 : 구슬 15개
// 게임은 다음과 같이 진행한다.
// ◆1차게임 : 어린이1은 어린이2의 구슬 5개를 획득한다.
// ◆2차게임 : 어린이2는 어린이1의 구슬 9개를 획득한다.
// ㄴ어린이 객체를 생성시 구슬의 보유갯수는 생성자를 통해 초기화 되어야 한다.
gusle child1 = new gusle(20); // 구슬 20개를 가진 어린이1 객체 생성
gusle child2 = new gusle(15); // 구슬 15개를 가진 어린이2 객체 생성
System.out.println("게임 전 구슬의 보유 개수");
System.out.print("어린이1 : ");
child1.showProperty(); //어린이1에 해당하는 호출하는 멤버 메소드를 부른다.
System.out.print("어린이2 : ");
child2.showProperty(); //어린이2에 해당하는 호출하는 멤버 메소드를 부른다.
/*1차게임 : 어린이1은 어린이2의 구슬 5개 획득*/
child1.obtainBead(child2, 5); // 전달된 어린이1은 +5, 어린이2는 -5
System.out.println("\n1차 게임 후 구슬의 보유 개수");
System.out.print("어린이1 : ");
child1.showProperty();
System.out.print("어린이2 : ");
child2.showProperty();
/*2차게임 : 어린이2가 어린이1의 구슬 9개 획득*/
child2.obtainBead(child1, 9); // 전달된 어린이2는 +9, 어린이1는 -9
System.out.println("\n2차 게임 후 구슬의 보유 개수");
System.out.print("어린이1 : ");
child1.showProperty();
System.out.print("어린이2 : ");
child2.showProperty();
}
}
먼저 데이터 보호를 위해 private으로 선언해준 이후
직접 접근이 안되므로 매개변수가 있는 생성자를 만들어준다.
생성자를 통해 자유롭게 간접적으로 접근이 가능해진다!
곧바로 단도직입적으로 계산하는 멤버메소드를 생성해준 후
메인 메소드에서 사용자로부터 입력값을 받고 차례대로 저장한 후
계산하는 멤버 메소드로 값을 보내어 반환을 받는 것이다.
그 값을 출력하는 간단한 프로그램이다.
import java.util.Scanner;
class ClassThree
{
// 정보은닉화 private
private int kor, eng, math;
// 매개변수가 있는 생성자 :
// 직접 접근이 안되어서 간접적으로 불러오기 위해
public ClassThree(int kor, int eng, int math)
{
this.kor = kor;
this.eng = eng;
this.math = math;
}
// 계산하는 멤버 메소드
public int avgr()
{
return ( kor + eng + math ) / 3;
}
public static void main(String[] args)
{
// 3. 성적 클래스를 작성해보자. 국어,영어, 수학 과목의 3개의 점수를 입력받아
// 객체를 생성하고 성적 평균을 출력하는 프로그램을 만들어라.
// 사용자로부터 입력값을 받고
Scanner scan = new Scanner(System.in);
// 각 변수에 저장한다
System.out.println("국어 영어 수학 점수를 순서대로 입력하시오:");
int kor = scan.nextInt();
int eng = scan.nextInt();
int math = scan.nextInt();
// ClassThree 클래스의 avg 객체를 생성하고 3변수를 담는다.
ClassThree avg = new ClassThree(kor,eng,math);
// avgr() 멤버메소드에 저장된 3변수를 담아서 출력한다.
System.out.println("당신의 평균 점수는 " + avg.avgr() + "점!");
}
}
- 이렇게 클래스의 기초를 다루어보았다.
생각해보면 자바(Java)는 중요하지 않는 것이 없는게 사실이다.
앞으로도 꿀 떨어지는 포스팅은 계속된다..