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
'프로그래밍 > 수업일지' 카테고리의 다른 글
수업일지 16일차 (23/10/12) - Java (2) | 2023.10.12 |
---|---|
수업일지 15일차 (23/10/11) - Java (1) | 2023.10.11 |
수업일지 13일차 (23/10/06) - Java (1) | 2023.10.07 |
수업일지 12일차 (23/10/05) - Java (1) | 2023.10.05 |
수업일지 11일차 (23/10/04) - Java (0) | 2023.10.04 |