728x90

 

수업내용 정리 (Java) - 복습 +a

 

1. part1

 1-1) 정보가 올라가는 곳(저장되는 곳)

  • 스택(1MB): 지역변수(큰 개념), 매개변수(작은 개념) / 메소드 실행이 끝나면 사라진다.
  • 힙(비례적으로 늘어남): 인스턴스(객체)
  • 메소드 영역(위 두 개보단 비교적 덜 중요): 클래스 정보, 클래스 변수

 

 1-2) 메인 ㄱ

더보기
public static void main(String[] arg) {
	int[] arr = new int[10000000];
	new Student();
	Student.scName = "인천대";
	Student.showTitle();
	
	Student kim = new Student("kim",1);
	kim.showStuInfo();
	Student lee = new Student("lee");
	lee.showStuInfo();
		
	Student cha = new Student(10);
	cha.showStuInfo();
	
	Student noname = new Student();		
}

 

// 클래스 메소드
public static void main(String[] arg){

}
  •  main도 클래스 메소드로 한 클래스에 하나만 존재할 수 있는 메소드다.

 

int[] arr = new int[10000000];
new Student();
Student.scName = "인천대";
Student.showTitle();
  • 배열과 class 객체를 생성해봤다.
  • 배열: int[] arr = new int[];
  • 객체: new Student();
  • 객체 값 지정: Student.scName = "인천대";
  • 객체 메소드: Student.showTitle();

 

//Student kim = new Student();
//kim = null;
//kim.setName("Kim");
//kim.setsNo(1);
Student kim = new Student("kim",1);
kim.showStuInfo();
Student lee = new Student("lee");
lee.showStuInfo();
	
Student cha = new Student(10);
cha.showStuInfo();

Student noname = new Student();
  • 객체의 값을 지정하고, showStuInfo 메소드를 통해 출력도 진행했다.
  • null: 아무 값도 가지고 있지 않다.

 

 1-3) Student 클래스 ㄱ

더보기
// 인스턴스 변수
static String scName = "인하공전";

// 인스턴스 변수_정보은닉
private int sNo;	//이 클래스 밖에서는 접근할 수 없게 하기 위해
//public int sNo;		//이 클래스 밖 어디서도 접근할 수 있도록 하기 위해
private String name;
  • 클래스의 인스턴스 변수는 정보은닉을 하는 것이 좋다.
  • private int sNo: 같은 클래스 내에서만 접근 가능 (클래스에는 private를 붙일 수 없음)
  • public int sNo: 접근 제한 없음

 

// 클래스 변수 / 인스턴스에 할당되는 변수가 아니라 클래스에 할당되는 변수)
/*
 final변수는 이름이 무조건 대문자. 값을 바꾸려고 하면 에러.
 클래스 변수이기 때문에 final static은 new SCNAME()이 아닌 SCNAME으로만 사용
 */

 

//생성자
public Student() {
	name = "noname";
	sNo = -1;
}
public Student(String name) {
	this.name = name;
}
public Student(int sNo) {
	this.sNo = sNo;
}
public Student(String name, int sNo) {
	this.name = name;
	this.sNo = sNo;
}
  • 매개변수를 아무것도 받지 않으면, 없다는 것을 알리기 위해 name을 noname으로 설정하고, sNo는 -1로 설정한다.
  • this: 현재 실행중인 인스턴스의 참조변수

 

public int getsNo() {
	return sNo;
}
public void setsNo(int sNo) {
	if(sNo<0) return;	//경계검사
	this.sNo = sNo;
}
public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}
public String getScName() {
	return scName;
}
public void setScName(String scName) {
	this.scName = scName;
}
  • set/get 메소드
  • set 메소드에 if문으로 경계검사를 할 수 있다. 위의 상황에서는 sNo가 0보다 작을 경우에는 리턴한다.
  • 마지막의 setScName은 this.scName에서 노란색 밑줄이 쳐지는데, 이거는 클래스변수를 set메소드에 넣어서 나는 경고다. 무시하고 실행해도 정삭작동 된다. (클래스변수는 보통 임의로 변경하지 않으므로 set메소드가 필요없음)

 

public void showStuInfo() {
	if(sNo==0) {
		System.out.println("\t"+name+"\t"+scName);
	}else if(name == null){
		System.out.println(sNo+"\t\t"+scName);
	}else {
		System.out.println(sNo+"\t"+name+"\t"+scName);
	}
}
  •  print를 할 때 조건문을 넣어서 해당하는 상황에 따라 다르게 출력되도록 했다.
  • 만약 sNo가 0이라면 즉, sNo를 입력하지 않거나 0을 입력했다면 sNo를 출력하지 않도록 했다.
  • 만약 name이 null이라면 즉, name을 입력하지 않았다면 name을 출력하지 않도록 했다.
  • 만약 그렇지 않다면 즉, sNo도 name도 값이 있다면 전부 출력하도록 했다.

 

public static void showTitle() {
	System.out.println("=====================");
	System.out.println("\t"+scName+" 학생명단");
	System.out.println("=====================");
}
  • 클래스 메소드
  • 인스턴스와 상관없는 일을 하는 메소드
  • 이 메소드 안에 System.out.println(name); 라는 코드를 넣게 된다면 인스턴스와 관련이 있기 때문에 에러가 난다.

 

 

2. part2

 2-1) AdderMain ㄱ

더보기
public static void main(String[] args) {
	SimpleAdder sa = new SimpleAdder();
	sa.adder(10);
	sa.adder(20);
	sa.adder(30);
	System.out.println(sa.getTotalNum());
}
// 체이닝
public static void main(String[] args) {
	SimpleAdder sa = new SimpleAdder()
	sa.adder(10).adder(20).adder(30);
	System.out.println(sa.getTotalNum());
}
  • 위의 코드와 아래의 코드는 동일하게 돌아가서 최종 60을 출력하게 된다.
  • 아래의 코드처럼 메소드를 연이어서 쓰는 것을 체이닝이라고 한다.

 

 2-1.2) Adder ㄱ

더보기
public class SimpleAdder {
	private int totalNum;
	
	public SimpleAdder adder(int num) {
		this.totalNum += num;
		return this;
	}
	
	public int getTotalNum() {
		return totalNum;
	}
}
  •  return this;는 자신(원본)을 반환한다.

 

 

 2-2) Ex03 ㄱ

더보기
public class Ex03 {
	public static void main(String[] args) {
		int boxVolume = boxVolume(3,3,3);	//가로,세로,높이
		System.out.println("박스 부피: "+boxVolume);	//27
		boxVolume = boxVolume(5,5);	//높이생략 / 생략하면 무조건 1
		System.out.println("박스 부피: "+boxVolume);	//25
		boxVolume = boxVolume(7);	//세로, 높이 생략
		System.out.println("박스 부피: "+boxVolume);	//7
	}
	

	private static int boxVolume(int i) {
		int volume = i;
		return volume;
	}
	private static int boxVolume(int i, int j) {
		int volume = i*j;
		return volume;
	}
	private static int boxVolume(int i, int j, int k) {
		int volume = i*j*k;
		return volume;
	}
}
//쌤이 하신것
private static int boxVolume(int width, int length, int height) {
	return width*length*height;
}
private static int boxVolume(int width, int length) {
	return boxVolume(width,length,1);	//앞의 메소드를 호출
}
private static int boxVolume(int width) {
	return boxVolume(width,1,1);
}
  • main메소드 아래에서 메소드를 만들어서 클래스를 만드는 대신 사용할 수 있다.
  • return에서 바로 계산하여 보내도 된다.

 

 

 2-3) ShapeMain ㄱ

더보기
// a팀 패키지
package aTeam;
public class Circle {
	public Circle() {
		System.out.println("A팀의 Circle");
	}
	public void showCircleInfo() {
		System.out.println("A팀의 showCircleInfo");
	}
}
// b팀 패키지
package bTeam;
public class Circle {
	public Circle() {
		System.out.println("B팀의 Circle");
	}
	public void showInfo() {
		System.out.println("B팀의 showInfo");
	}
}
  • 자바의 클래스는 무조건 패키지에 들어있어야 한다.
  • 패키지를 선택하지 않고 클래스를 만들면 default 패키지에 들어가게 된다. (default를 권장하지 않음)

 

import aTeam.Circle;

public class ShapeMain {
	public static void main(String[] args) {
		Circle cir = new Circle();
		cir.showCircleInfo();
		System.out.println("-------------------");
		bTeam.Circle cir2 = new bTeam.Circle();
		cir2.showInfo();
	}
}
  • 같은 프로젝트 내에서라면 a팀의 패키지의 Circle만 import해왔지만 b팀의 패키지의 Circle도 사용할 수 있다.

 

 

 2-4) String test ㄱ

더보기
String name = "kim";
String name2 = "kim";
//name == name2: 참조값이 같다.
//name.equals(name2): 문자열이 같다.

name = "kim"
name2 = new String("kim");
//name == name2: 참조값이 다르다.
//name.equals(name2): 문자열이 같다.

name = new String("kim");
name2 = new String("kim");
//name == name2: 참조값이 다르다.
//name.equals(name2): 문자열이 같다.

name = "kim";
name2 = "cha";
//name == name2: 참조값이 같다.
//name.equals(name2): 문자열이 다르다.

name = "kim"
name2 = new String("cha");
//name == name2: 참조값이 다르다.
//name.equals(name2): 문자열이 다르다.

name = new String("kim");
name2 = new String("cha");
//name == name2: 참조값이 다르다.
//name.equals(name2): 문자열이 다르다.
  • ==: 참조값을 비교
  • .equals: 문자열을 비교

 

 

3. part3

 3-1) ShapeMain ㄱ

더보기
Point p = new Point(4,4);
Circle cir = new Circle(p, 5.5);
cir.showCircleInfo();
//중심좌표
//x: 4 / y: 5
//반지름: 5.5

Circle cir2 = new Circle(4,4, 5.5);
//중심좌표
//x: 4 / y: 5
//반지름: 5.5
cir2.showCircleInfo();
  • import는 패키지가 다를 때에만 사용한다.

 

 3-2) Point ㄱ

더보기
public class Point {
	private int x, y;	// 0~100 음수나 100 초과의 숫자는 안 받음
	
	public Point(int x, int y) {
		setX(x);	// 밑의 메소드 호출
		setY(y);
	}

	public int getX() {
		return x;
	}
	public void setX(int x) {
		if(x<0 || x>100) return;
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		if(y<0 || y>100) return;
		this.y = y;
	}
	
	//좌표 정보 출력
	public void showPointInpo() {
		System.out.println("======중심좌표======");
		System.out.println("x: "+x+"\ty: "+y);
	}
}
  • 좌표 정보를 출력하는 showPointInpo 메소드는 인스턴스 메소드.

 

 3-3) Circle ㄱ

더보기
public class Circle {
	private Point p;	//new Point(1,1);	//중심좌표
	private double radius;	//반지름

	public Circle(Point p, double rad) {
		this.p = p;
		radius = rad;
	}
    public Circle(int x, int y, double rad) {
		p = new Point(x, y);
		radius = rad;
	}

	public void showCircleInfo() {
		//중심좌표
		//x: 4 / y: 5
		//반지름: 5.5
		p.showPointInpo();
		System.out.println("---------");
		System.out.println("반지름: "+radius);
	}
}
  • 인스턴스 변수에 다른 클래스를 호출할 수 있다.

 

 3-4) 심화 ㄱ

더보기

ShapeMain

Ring ring = new Ring(4,4,5.5, 5,5,6.6);
ring.showRingInfo();

Ring ring2 = new Ring(new Circle(4,4,5.5),	new Circle(5,5,6.6));
ring2.showRingInfo();

 

Point

public class Point {
	private int x, y;	// 0~100 음수나 100 초과의 숫자는 안 받음
	
	public Point(int x, int y) {
		setX(x);	// 밑의 메소드 호출
		setY(y);
	}

	public int getX() {
		return x;
	}
	public void setX(int x) {
		if(x<0 || x>100) return;
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		if(y<0 || y>100) return;
		this.y = y;
	}
	
	//좌표 정보 출력
	public void showPointInpo() {
		System.out.println("======중심좌표======");
		System.out.println("x: "+x+"\ty: "+y);
	}
}
  • 위의 코드 그대로 사용

 

Circle

public class Circle {
	private Point p;	//new Point(1,1);	//중심좌표
	private double radius;	//반지름

	public Circle(Point p, double rad) {
		this.p = p;
		radius = rad;
	}
    public Circle(int x, int y, double rad) {
		p = new Point(x, y);
		radius = rad;
	}

	public void showCircleInfo() {
		//중심좌표
		//x: 4 / y: 5
		//반지름: 5.5
		p.showPointInpo();
		System.out.println("---------");
		System.out.println("반지름: "+radius);
	}
}
  • 위의 코드 그대로 사용

 

Ring

public class Ring {
private Point p;
private Point p2;
private Circle inCircle;	//new Circle();
private Circle outCircle;

public Ring(Point p, double r, Point p2, double r2) {
	inCircle = new Circle(p, r);
	outCircle = new Circle(p2, r2);
}

public Ring(int x, int y, double r, int x2, int y2, double r2) {
	p = new Point(x, y);
	inCircle = new Circle(p, r);
	p2 = new Point(x2, y2);
	outCircle = new Circle(p2, r2);	
}
public Ring(Circle inCircle, Circle outCircle) {
	this.inCircle = inCircle;
	this.outCircle = outCircle;
}

public void showRingInfo() {
	System.out.println("=======================");
	System.out.println("링의 안쪽");
	inCircle.showCircleInfo();
	System.out.println("\t----");
	System.out.println("링의 바깥쪽");
	outCircle.showCircleInfo();
	System.out.println("=======================");
}

 


 

질문한 내용이나 어려웠던 점 메모

1. String test

  • String인데 null값을 제외하려면 .equlas를 사용해야 한다고 그래서 많이 헷갈렸다.

 


 

전체 피드백

  • 모르겠으면 일단 외울것!!!
  • 선생님이 바뀌면서 방식을 따라가기 너무 힘들었다..게다가 잠을 이상하게 잔 바람에 컨디션 관리에 실패하고 말았다. 제대로 컨디션 조절하기..!

 


728x90