# 클래스패스 : 클래스를 찾기 위한 경로
- cmd 명령어
mkdir sub - 디렉토리 만들기 명령어 move AAA.class .\sub\ - 무브 도스명령어 : AAA클래스를 sub 폴더로 옮기겠다! help - 단축키 보여줌 set classpath=.;\sub'; 현재 폴더와 서브라는 폴더까지 찾는 것
pause cmd창이 꺼지지 않게 함 배치파일 .bat - 확장자를 bat 줘야함, 더블클릭 시 실행 |
# 컴파일 옵션
-d 패키지가 있으면 패키지(폴더)까지 같이 만들어라!
-d . Circle.java 패키지가 있으면 현재 폴더에 패키지를 만들어 컴파일 해라
ㄴ .은 현재폴더라는 뜻
- javac -d . *.java 중간에 v.v로 양 옆을 띄어주기
ex)
javac *.java
mkdir sub
move AAA.class.\sub\
move BBB.class.\sub\
set classpath=.;.\sub\
java ClassPathTest
pause
# public class의 문법적 특징
1. public class의 이름과 자바 파일의 이름은 대소문자까지 완벽하게 똑같아야 한다 (그렇지 않으면 에러)
2. 하나의 자바 파일에는 public class가 단 한 개 밖에 존재할 수 없다
일반 클래스는 몇 개가 있어도 상관없다 (대개 관리 상의 이유로 클래스 하나만 파일 마다 넣음)
- 한 폴더 내 동일 파일 이름이 존재할 수 없어 메인 클래스에서 중복으로 인해 컴파일 에러
ex) Circle.java 현재폴더
Circle.java 서브폴더
그래서 패키지가 필요하다.
패키지는 해당 파일들의 위치 정리 해주는 것
ex) 홍길동 2명 - 반을 분리 - a반 홍길동 - b반 홍길동
# 패키지 선언
이름이 너무 길어서 짧은 이름을 선언해주는 것 (패키지명을 안쓰고 클래스명으로 짧게 표현해주는 것)
package orange.area;
import orange.area.Circle; // 마지막 .뒤는 클래스명
- package가 가장 상위
그 다음에 import 작성할 것
- 패키지 이름은 소문자로 써주기
import java.util.Scanner;
Scanner sc = new Scanner(System.in);
// 동일내용
java.util.Scanner sc = new java.util.Scanner(System.in); import 안쓸 경우
ex)
파일명 : FruitSeller.java
package orange.seller;
public class FruitSeller
{
int numOfApple;
int myMoney;
final int APPLE_PRICE;
public FruitSeller(int money, int appleNum, int price)
{
myMoney=money;
numOfApple=appleNum;
APPLE_PRICE=price;
}
public int saleApple(int money)
{
int num=money/APPLE_PRICE;
numOfApple-=num;
myMoney+=money;
return num;
}
public void showSaleResult()
{
System.out.println("남은 사과: " + numOfApple);
System.out.println("판매 수익: " + myMoney);
}
}
파일명 : FruitBuyer.java
package orange.buyer;
import orange.seller.Fruitseller;
public class FruitBuyer
{
int myMoney;
int numOfApple;
public FruitBuyer(int money)
{
myMoney=money;
numOfApple=0;
}
public void buyApple(FruitSeller seller, int money)
{
numOfApple+=seller.saleApple(money);
myMoney-=money;
}
public void showBuyResult()
{
System.out.println("현재 잔액: " + myMoney);
System.out.println("사과 개수: " + numOfApple);
}
}
파일명 : FruitSalesMain3.java
import orange.seller.FruitSeller;
import orange.buyer.FruitBuyer;
class FruitSalesMain3
{
public static void main(String[] args)
{
FruitSeller seller1 = new FruitSeller(0, 30, 1500);
FruitSeller seller2 = new FruitSeller(0, 20, 1000);
FruitBuyer buyer = new FruitBuyer(10000);
buyer.buyApple(seller1, 4500);
buyer.buyApple(seller2, 2000);
System.out.println("과일 판매자1의 현재 상황");
seller1.showSaleResult();
System.out.println("과일 판매자2의 현재 상황");
seller2.showSaleResult();
System.out.println("과일 구매자의 현재 상황");
buyer.showBuyResult();
}
}
파일명 : Fruit.bat (배치파일)
javac -d . *.java
FruitSalesMain3
pause
- 멤버변수는 데이터의 안정성 때문에 함부로 접근하게 하면 안된다
ㄴ ex) private int price처럼 private을 주면 컴파일 시 에러 발생하게 함
앞으로는 데이터의 안정성을 위해 private 선언하기!
# 접근제어 지시자의 종류와 접근 허용범위
지시자 | 클래스 내부 | 동일 패키지 | 상속받은 클래스 | 이외의 영역 |
privata | o | x | x | x |
default | o | o | x | x |
protected | o | o | o | x |
public | o | o | o | o |
- 접근제어 지시자를 적어두지 않으면 디폴트 접근제어 지시자 (클래스 내부와 동일 패키지에서 접근 가능)
- 모든 클래스는 패키지에 소속되어 있어야 한다
- public은 보통 메소드에 많이 선언한다
- 멤버변수에 private를 주는 것을 정보은닉이라고 책에서는 표현하기도 한다.
ex)
class Rectangle
{
private int ulx, uly; // 좌 상단 x, y 좌표
private int lrx, lry; // 우 하단 x, y 좌표
private boolean isProperRange(int pos)
{
if(0<=pos && pos <= 100)
return true;
else
return false;
}
public void setRectanglePoint(int lx, int ly, int rx, int ry)
{
if(lx>=rx || ly>=ry)
{
System.out.println("좌표 지정이 잘못되었습니다.");
return;
}
if( !isProperRange(lx) || !isProperRange(ly) ) -! 사용해서 false가 true가 되고 뒤는 확인 안함
{
System.out.println("좌 상단 좌표의 범위가 잘못되었습니다.");
return;
}
if( !isProperRange(rx) || !isProperRange(ry) )
{
System.out.println("우 하단 좌표의 범위가 잘못되었습니다.");
return;
}
ulx = lx;
uly = ly;
lrx = rx;
lry = ry;
}
public void showArea()
{
int xLen = lrx - ulx;
int yLen = lry - uly;
System.out.println("넓이 : " + (xLen*yLen) );
}
}
class RectangleMain
{
public static void main(String[] args)
{
Rectangle rec = new Rectangle();
rec.setRectanglePoint(-3, -1, 2, 7);
rec.showArea();
rec.setRectanglePoint(2, 2, 8, 8);
rec.showArea();
}
}
ex)
class Number
{
private int num;
public Number()
{
this.num = num;
}
public void setNum(int num)
{
this.num=num;
}
public int getNum()
{
this.num=num;
}
}
class NumberMain
{
public static void main(String[] args)
{
Number n1 = new Number(5);
// n1. num = 10; <-private로 되어 있어 접근 불가능
n1.setNum(10);
System.out.println(n1.getNum());
}
}
#엑세스메소드
쌍으로 이루어짐(문법적 오류는 아니나 개발자들의 규칙임)
특정 프레임워크에서는 이 규칙대로 만들지 않으면 에러나는 경우가 있음
- setNum(세터)
앞에 set + 변수 첫 글자 대문자 시작
- int getNum(게터)
지금 필요하진 않지만 나중에 필요할 가능성을 염두해 예비적으로 만드는 경우가 있다
//Tip : 참조변수는 초기화하지 않으면 null값으로 자동 초기화 된다
ex)
public class AAA // AAA의 접근제어지시자 - public
{
AAA() // 생성자의 접근제어지시자 - default ∴ 어디서든 접근 가능하지 않다
{}
}
public class BBB // BBB의 접근제어지시자 - default ∴ 어디서든 접근 가능하지 않다
{
BBB() // 생성자의 접근제어지시자 - public
{}
}
- 접근제어지시자를 통일해서 주는 것이 논리적으로 맞다
- 모든 클래스는 반드시 생성자를 가지고 있어야 한다
만들지 않으면 자바 컴파일러가 자동 삽입한다
ex)
class CCC
{
CCC() // 자동으로 생성된 생성자 - default
{}
}
public class DDD // DDD의 접근제어지시자 - default ∴ 어디서든 접근 가능하지 않다
{
public DDD() // 자동으로 생성된 생성자 - public
{}
}
- 클래스를 따로 만들어주면 더 좋은 알고리즘이 나왔을 때 이것만 수정 가능하기 때문에 유지보수가 편리해짐
캡슐화 되는 장점이 있음
ex)
package orange.cal;
public class Calculator
{
private Adder adder;
private Subtractor subtractor;
public Calculator()
{
adder = new Adder();
subtractor = new Subtractor();
}
public int addTwoNumber(int num1, int num2)
{
return adder.addTwoNumber(num1, num2);
}
public int subTwoNumber(int num1, int num2)
{
return subtractor.subTwoNumber(num1, num2);
}
public void showOperatingTimes()
{
System.out.println("덧셈 횟수: " + adder.getCntAdd());
System.out.println("뺄셈 횟수: " + subtractor.getCntSub());
}
}
class Adder
{
private int cntAdd;
Adder() { cntAdd = 0; }
int getCntAdd() { return cntAdd; }
int addTwoNumber(int num1, int num2)
{
cntAdd++;
return num1 + num2;
}
}
class Subtractor
{
private int cntSub;
Subtractor() { cntSub = 0; }
int getCntSub() { return cntSub; }
int subTwoNumber(int num1, int num2)
{
cntSub++;
return num1 - num2;
}
}
ex)
class SinivelCap // 콧물 처치용 캡슐
{
public void take(){System.out.println("콧물이 싹~ 낫습니다.");}
}
class SneezeCap // 재채기 처치용 캡슐
{
public void take() {System.out.println("재채기가 멎습니다.");}
}
class SnuffleCap // 코막힘 처치용 캡슐
{
public void take() {System.out.println("코가 뻥 뚫립니다.");}
}
class ColdPatient 감기환자
{
public void takeSinivelCap(SinivelCap cap){cap.take();}
public void takeSneezeCap(SneezeCap cap){cap.take();}
public void takeSnuffleCap(SnuffleCap cap){cap.take();}
}
class Encapsulation1
{
public static void main(String[] args)
{
ColdPatient sufferer = new ColdPatient();
sufferer.takeSinivelCap(new SinivelCap());
sufferer.takeSneezeCap(new SneezeCap());
sufferer.takeSnuffleCap(new SnuffleCap());
}
}
- 다시 접근 불가한 경우
한번은 참조할 수 있겠지만 참조변수 없어서 다시 못감(주소값 없어서)
참조변수가 없으면 접근할 수 있는 방법이 없기 때문에 자바의 가비지 콜렉터가 언젠가는 메모리상에서 사라짐
ㄴ 장점 : 편함(c는 개발자가 메모리 관리를 함)
단점 : 메모리 부담이 어느정도 있음
∴ 계속 객체의 정보 사용을 하고 싶을 땐 참조변수 저장해줘야 함
Q. 알약을 먹는 순서가 중요한 경우 (잘못 먹으면 심각한 부작용 발생)
class SinivelCap // 콧물 처치용 캡슐
{
public void take(){System.out.println("콧물이 싹~ 낫습니다.");}
}
class SneezeCap // 재채기 처치용 캡슐
{
public void take() {System.out.println("재채기가 멎습니다.");}
}
class SnuffleCap // 코막힘 처치용 캡슐
{
public void take() {System.out.println("코가 뻥 뚫립니다.");}
}
class CONTAC600
{
SinivelCap sin;
SneezeCap sne;
SnuffleCap snu;
public CONTAC600()
{
sin=new SinivelCap();
sne=new SneezeCap();
snu=new SnuffleCap();
}
public void take() // 알약을 순서대로 먹게하는 것, 실수할 여지가 없음, 하나로 감싸는 것(캡슐화)
{
sin.take();
sne.take();
snu.take();
}
}
class ColdPatient
{
public void takeCONTAC600(CONTAC600 cap){cap.take();}
}
class Encapsulation2
{
public static void main(String args[])
{
ColdPatient sufferer = new ColdPatient();
sufferer.takeCONTAC600(new CONTAC600());
}
}
- 캡슐화 : 기본적으로 보안적인 효과가 있다
Q.
문제 폴더에 있는 소스를 가지고 다음과 같은 출력 결과를 나오게 하자.
class Point x좌표와 y좌표를 나타낸다.
class Circle 중심좌표(x좌표와 y좌표)와 반지름의 값을 갖는다.
class Ring 안쪽원(Circle)과 바깥쪽원(Circle)로 이루어져 있다.
<출력 결과>
Inner Circle Info...
radius : 4
[1, 1]
Outter Circle Info...
radius : 9
[2, 2]
A.
class Point
{
private int xPos, yPos;
public Point(int x, int y)
{
xPos = x;
yPos = y;
}
public void showPointInfo()
{
System.out.println("[" + xPos + ", " + yPos + "]");
}
}
class Circle
{
private Point center;
private int radius;
Circle(int xPos, int yPos, int radius)
{
center = new Point(xPos, yPos);
this.radius = radius;
}
public void showCircleInfo()
{
System.out.println("radius : " + radius);
center.showPointInfo();
}
}
class Ring
{
private Circle ic;
private Circle oc;
Ring(int iXPos, int iYPos, int iRadius, int oXPos, int oYPos, int oRadius)
{
ic = new Circle(iXPos, iYPos, iRadius);
oc = new Circle(oXPos, oYPos, oRadius);
}
public void showRingInfo()
{
System.out.println("Inner Circle Info...");
ic.showCircleInfo();
System.out.println("Outer Circle Info...");
oc.showCircleInfo();
}
}
class MainClass
{
public static void main(String[] args)
{
Ring ring = new Ring(1, 1, 4, 2, 2, 9);
ring.showRingInfo();
}
}
- 오브젝트에 생성자는 포함되지 않는다
- 하나의 클래스 안에 넣을 수 있는 내용이지만 부분 수정 등의 유지보수를 위해선 별도로 저장하는 것이 좋음
'SW > Java' 카테고리의 다른 글
[필기정리]Day8-2 - compareTo, 메소드체이닝 등 (0) | 2020.06.21 |
---|---|
[필기정리] Day8-1 - static변수, 메소드 오버로딩 등 (0) | 2020.06.21 |
[필기정리] Day6 - 카멜케이스, 생성자 (0) | 2020.06.21 |
[필기정리] Day5 - return, 재귀메소드 등 (0) | 2020.06.21 |
[필기정리] Day4 - 형변환, 비트연산자 등 (0) | 2020.06.21 |