ㅡㅡㅡ
20240117(수)
●목차
ㅡㅡㅡ
1)메소드와 배열
파일명 : day13/array3/ArrayExam3_1
ㅡㅡㅡ
2)String형 참조타입의 변수, 변수의 직접적인 변화의 과정.
파일명 : day13/array3/MemoryExam01
ㅡㅡㅡ
3)클래스의 구조
파일명 : day13/class1/Student
ㅡㅡㅡ
4)클래스를 메인메소드에서 호출
파일명 : day13/class1/StudentMainExam
ㅡㅡㅡ
ㅡㅡㅡ
1)
파일명 : day13/array3/ArrayExam3_1
//스타틱에서 호출하고싶다면, 정의하는 곳도 스타틱으로 해야한다.
int a=3;
int b=5;
int[] num = new int[] {10,20,30};
add(a,b);
int result = addResult(a, b);
System.out.println(result);
arryshow1(new int[] {50,70,80});
arryshow2(num);
}//end of main
public static void add(int a,int b) {//스타틱에서 호출하고싶다면, 정의하는 곳도 스타틱으로 해야한다.
//public static void add() :메소드 , (int a, int b) : 파라미터(매개변수)
//매개변수 이름은 전달인자랑 이름이 같은것이 좋다. 그래서 뭘 받아야하는지 알기가 쉽다.
a = a + 3;
b = a + 7;
System.out.println("a =" + a);
System.out.println("b =" + b);
return;
}//end of add
public static int addResult(int a, int b) {
a = a + 3;
b = a + 7;
return a + b;
}//end of addResult
public static void arryshow1(int[] score) {
for(int i = 0 ; i <score.length; i++) {
System.out.println("score[" + i + "]" + score[i]);
}
System.out.println();
}//end of addResult
public static void arryshow2(int[] num) {
for(int i = 0 ; i <num.length; i++) {
System.out.println("num[" + i + "]" + num[i]);
}
System.out.println();
}//end of addResult
#
지역변수는 ★언제나, 선언과 함께 초기화를 시킨다.
멤버변수는 초기화를 자동으로 시킨다.(이유는 힙영역에 저장되기 떄문이다. 힙영역은 완성되지 않으면 올라가지 않기 때문에, JVM 초기화를 시키고 올린다)
int[]num = new int[] {10,20,30};
new붙으면, 힙에다가 만들어라.
new라고 붙으면, 실제 값을 받기보단, 객체는 주소값을 받는다.
public static int arryshow2(int a, int b) {
a = a + 3;
b = a + 7;
return a + b;
}//end of addResult
생성자,
스타틱 - 클래스 뱃속에 미리 메모리에 올라가 있다.
스타틱 = 모두가 공통으로 써야되는 것, 누구든지 와서 쓰고 바꿀수있는 것.
메소드 - 정적
힙영역 : 객체와 배열이 생성되는 것
안붙이면, 설계도에 올라가있다.
MemoryExam01
int a = 3;
String name = new String("홍길동");
int[] score = {10,20,30};
String irum = null;
int[] jumsu = null;
int b = 0;
System.out.println("a: "+ a); //3
System.out.println("name: "+ name); //홍길동(이것도 원래 주소값 나와야하는데, 오버라이딩, 재정의 되어있다.)
System.out.println("score: "+ score);//이상한문자(주소값)
System.out.println("--------------------");
System.out.println("b: "+ b); //0
System.out.println("irum: "+ irum); //null;
System.out.println("jumsu: "+ jumsu); //주소가 나올줄 알았는데, null이 나왓다. ★★
System.out.println("--------------------");
irum = name;
jumsu = score;
b = a;
System.out.println("b: "+ b); //
System.out.println("irum: "+ irum); //
System.out.println("jumsu: "+ jumsu); //
//irum = name 은 주소값을 담아준다. 결국은 힙영역을 가리킨다.(참조변수)
//jumsu = score; 주소값을 담아준다. 결국은 힙영역을 가리킨다.(참조변수)
//b =a 실제 값을 담아준다.(기본타입변수)
//참조변수는 주소값을 넘겨주거나 받는다. 그래서 같은 곳을 바라본다.
// ==해도되고, equls 해도된다.
name = "김자바"; //name은 바뀌었지만, irum은 직접적으로 변화는 주지 않았다.★★★
System.out.println("name: " + name);//김자바
System.out.println("irum: "+ irum); //홍길동 >>> irum은 바뀌지 않는다. ★★★
irum = "한사랑";
System.out.println("name: " + name);//김자바
System.out.println("irum: "+ irum); //한사랑
//변수는 하나의 값이나 주소만을 담을 수 있다.(마지막에 담긴 값만 담는다)
ㅡㅡㅡ
2)
파일명 : day13/array3/MemoryExam01
int a = 3;
String name = new String("홍길동");
int[] score = {10,20,30};
String irum = null;
int[] jumsu = null;
int b = 0;
System.out.println("a: "+ a); //3
System.out.println("name: "+ name); //홍길동(이것도 원래 주소값 나와야하는데, 오버라이딩 재정의 되어있다.)
System.out.println("score: "+ score);//이상한문자(주소값)
System.out.println("--------------------");
System.out.println("b: "+ b); //0
System.out.println("irum: "+ irum); //null;
System.out.println("jumsu: "+ jumsu); //주소가 나올줄 알았는데, null이 나왓다. ★★
System.out.println("--------------------");
irum = name;
jumsu = score;
b = a;
System.out.println("b: "+ b); //
System.out.println("irum: "+ irum); //
System.out.println("jumsu: "+ jumsu); //
//irum = name 은 주소값을 담아준다. 결국은 힙영역을 가리킨다.(참조변수)
//jumsu = score; 주소값을 담아준다. 결국은 힙영역을 가리킨다.(참조변수)
//b = a 실제 값을 담아준다.(기본타입변수)
//참조변수는 주소값을 넘겨주거나 받는다. 그래서 같은 곳을 바라본다.
// ==해도되고, equls 해도된다.
name = "김자바"; //name은 바뀌었지만, irum은 직접적으로 변화는 주지 않았다.★★★
System.out.println("name: " + name);//김자바
System.out.println("irum: "+ irum); //홍길동 >>> irum은 바뀌지 않는다. ★★★
irum = "한사랑";
System.out.println("name: " + name);//김자바
System.out.println("irum: "+ irum); //한사랑
//변수는 하나의 값이나 주소만을 담을 수 있다.(마지막에 담긴 값만 담는다)
스택에 우리가 안보이는 사이에, 프레임을 생성한다.
스택에다가 a라는 변수에 3을 담는다.
name은 new가 붙었다. 힙이라는 영역에 생성한다.그리고 스택에 있는 name에 힙의 주소값을 담는다.
score가 만약 힙영역에 20번지라고 가정하자
String irum = null >>> 아직 가리키는것이 없다.
int[] jumsum = null >>>> 아직 가르키는 곳이 없다.
int b = 0; >>> 0이 담겨져있다.(스택에)
출력해보자
ㅡㅡ
212p 객체 지향 프로그래밍
1.캡슐화(private이 캡슐화를 처리하겠습니다. 말하는 것)
자동차라는 본질은 바꾸지않지만, 약간 튜닝해서 쓸수있는 것
2.상속
공통된거는 부모에다가 만들어놓고, 나머지 기능들은 자식들한테 쓰자.
3.추상화
추상클래스 인터페이스
자바에서 클래스 (설계도/붕어빵틀/구조)이라 한다.
아파트를(객체/인스턴스)이라 한다. ㅡ누구로부터 만들어진다(인스턴스라한다) 그외 객체
붕어빵틀로 만드는 작업이 필요하다.
아파트전체구조/세부적인구조/ > 설계도(구조)
전체구조가 부모라고 할수 있다.(부모는 공통된 것들)
클래스(class)
클래스의멤버-필드 : (=멤버변수) - 필요한 물건(ex)
클래스의멤버-메소드 : 동작하는 방식 설명이 필요한것 - 기능 동작(작동시키는방식)
클래스의멤버-생성자 : 부모이름이랑 똑같이 쓴다. 객체를 만들떄, 초기화를 시킨다(생성자 없으면, 객체 못만든다).준비시키는 것
ex)학생이라는 student(클래스) - 공통적으로 쓰이는 것을 우리는 클래스로 만든다.
이름 = 필드(멤버변수) - 그릇
나이 = 필드(멤버변수) - 그릇
학번 = 필드(멤버변수) - 그릇
공부 한다 = 메소드
운동을 한다 = 메소드
학교를 간다 = 메소드
ex)클래스라는 틀하나만이면, 홍길동,김자바라는 객체를 만들 수 있다.
★ 질문
#배열 - 행과열
#추상화
#생성자
String[] ber = {커피,콜라,라떼,녹차}
int[] price = {3500,1500,4600,5300}
int[] money = new int[];
int[] amount = new int[4];
#배열은 같은것만을 담을수밖에 없다. > 단순화할순없을까? > 그래서 클래스가 나왔다.
ㅡㅡㅡ
●클래스생성
패키지이름 : class.student.java 정식소스파일 이름
Modifiers : 접근지정자,접근제한자.
public :누구나 써라
package : defalts
private 캡슐화(작업공간에서 자유롭게, 벗어나면 아무도 못써)
protected(실무에서 잘안씀, 패키지안에 클래스는 자유롭게 썬다. 패키지 오고가면 몼쓰지만, 상속에서는 쓴다.
abstract = 코끼리다리정의할태니, 나머지는 니네가 알아서해
final= 절대못바꿔
static= 클래스에서는 비활성, 공통으로 쓰고싶은것 (파블릭과 다른점은?)
Superclass: 부모클래스 부모로부터 상속받는다.(java.lang.Object) 모든클래스의 부모
약속된것 Object
interfaces: 약속안된 추상메소드 정의(추상메소드의 집합)
1)public satic void main
main = JVM이 뭔가 실행하는 진입점.붕어빵을 만들떄, 쓰고 할떄, 설꼐만들떄는 메인이 필요없다. 그래서 클래스에서 안줘도댄다.
2)Constructors from superclass : 부모 클래스에서 생성자를 가져온다. Constructors from superclass
3)inherited abstract methods : 추상메소드를 상속받는다.
ㅡㅡㅡ
●
3)
파일명 : day13/class1/Student
public class Student { //클래스의 시작
//public 파블릭을 지운다면 = 디폴트라는 것
//public 자붙으면 소스파일이랑 같아야 한다.
//#1.필드(멤버변수) : 다른말로 '속성' -어떤것을 지정하는 것
//학생의 속성을 만드려한다.
/*
public String name;//누구나써
private int age; //여기에서만써
int score; //디폴트
*/
String name;
int age;
int score;
//#2.생성자 - 객체를 초기화,
// 기본생성자는 생략이 가능 - 생략하면 컴파일시 JVM이 만든다.
//생성자는 부모타입과 같은 타입, 약간 낮은 단계를 쓴다.
//생성자는 클래스이름이랑 동일 해야한다.
public Student() { //생성자는 클래스이름이랑 동일 해야한다.
//생성자는 부모타입과 같은 타입, 약간 낮은 단계를 쓴다. (public)
}
public void gotoSchool() {
System.out.println(name + "이(가) 학교에 간다");
}
//#2.메소드 - 동작방식,기능처리,처리역할
//main static에서 부르는 곳에서 메소드 호출받을려면 static써야된다.
//그러므로 class에서는 붙이는 것 없으니깐.안붙여도된다?
//설계하는곳 - 메소드밖(클래스 영역)
//처리하는곳 - 메소드안
}
클래스명 필드 메소드
타입 이름 내용 반환타입 이름 매개변수타입 매개변수타입 변수명
Student 이름 : String name 학교간다 : void gotoScholl 없음
나이 : int age 운동한다
점수 : int score
+public
-defalut
모든 사람이 보든, 수정하더라도, 어디를 찾아가야하는지 안다. (소통이 된다.문제가 없다.)
#엑셀, 구글드라이브(구글시트,구글pt,드로우아이를 공유해서 쓴다.),notion,slack
Git
#메모리 관리
- 힙 = 객체가 들어간다.
- 필드(=멤버변수)는 객체뱃속에 있다. 그래서 필드(멤버변수)는
스택은 개발자가 초기화가 해준다.
힙은 JVM이 초기화를 시켜준다.
그러므로 객체는 JVM이 초기화시켜준다.
객체 뱃속에 있는 멤버변수는 JVM이 초기화시켜준다.
(비어있으면 힙에 못올라가니깐 JVM이 일단 초기화시켜서 올린다)
//메인메소드안에 지역변수는★★ {}괄호 안에서사용
//클래스안에 멤버변수★★ 클래스{}괄호 안에서사용
//for중괄호 안에 있는 지역변수 {}괄호 안에서사용
데이터영역 스택(지역변수) 힙(객체(인스턴스),배열)
클래스영역 std new라는것은 객체만든다.
(설계도
(Student)
메소드영역
gotoschool??
Student생성자는 클래스가서
public Student(){ //초기화필요한문장}실행시키고
public void gotoSchool(){};준비시키는 역할
ex) std.name =”홍길동”
std에 가르키는 곳에 가서 name이름표가 붙은곳에 가서 홍길동을 넣어줘
ex)std.age=20;
std에 가르키는 곳에 가서 age이름표가 붙은곳에 가서 홍길동을 넣어줘
es)std.score=70;
std에 가르키는 곳에 가서 score이름표가 붙은곳에 가서 홍길동을 넣어줘
ex)std.gotochool();
std에 가르키는 곳에 가서 gotoSchool을 찾아가면 다시 데이터 영역에가서 gotoSchool()을 실행시켜줘
멤버변수(필드)
String name
int age
int score
>>> 객체(힙영역)안에 만들어진다.
ㅡㅡㅡ
4)
파일명 : day13/class1/StudentMainExam
public static void main(String[] args) {
//#1. 설계도(붕어빵틀, 클래스)를 가져다가 객체(=붕어빵, 인스턴스)를 만들기
//Scanner scan = new Scanner(System.in);
//생성자 Scanner(new뒤에있는)
// new Student(); << 이렇게만 써도 힙에다가 올라가진다.
// Student stu = new Student(); 위치를 모르니깐 변수(그릇)에다 담았다.
Student std = new Student();
//Student:타입 //std:참조변수:주소담김 //Student()생성자를 std에 담아라
//#2.만든 객체 사용
//#2-1. 객체 안에(뱃속) 있는 필드에 값을 담기
std.name ="홍길동";
std.age = 20;
std.score= 70;
//std.name을 찾을떄, 옆에 어느 클래스인지 확인하고 하는것이 좋다.
//#2-2. 객체의 뱃속에 있는 필드의 내용 읽어 오기
System.out.println("std.name : " + std.name);
System.out.println("std.name : " + std.age);
System.out.println("std.name : " + std.score);
System.out.println();
//선언때만, 직접쓰고, 나머지는 자동완성이 좋다.
//#3. 객체의 (백속에 있는) 메소드를 호출
std.gotoSchool();
●PM
설계를 해야한다.
(주석다는 것, 팀원이 모두가 작업하기 떄문에)
1.좋은 설계
2.주석필수
#####
설계예제
출력 형태)
음료 번호를 선택하세요....
========================================================================
1.아메리카노(2500)|2.라떼(4500)|3.콜라(1500)|4.홍차(5500)|0. 종료
=======================================================================
음료선택>> 1
주문 수량을 입력 >> 2
주문을 계속하시겠습니까?
=========================
1.주문계속 | 2.주문취소
========================
1
음료 번호를 선택하세요....
========================================================================
1.아메리카노(2500)|2.라떼(4500)|3.콜라(1500)|4.홍차(5500)|0.주문 취소
=======================================================================
음료선택>> 2
주문 수량을 입력 >> 3
주문을 계속하시겠습니까?
=========================
1. 주문계속 | 2. 주문종료
========================
선택>> 2
주문을 종료합니다.
====================================
음료명 주문수량 주문금액
=====================================
아메리카노 2잔 5,000원
라떼 3잔 13,500원
======================================
주문 수량 합계 : 5잔
결제 금액 총액 : 18,500원
1.스캐너객체 필요
2.수량에 대한 변수
3.주문변수
4.결과에 대한 변수
5.총 주문 금액에 대한 변수
*구조잡기
변수에 대한 유무
메소드
요구사항
*1)
변수 : 대략적으로 만든다.
- 음료 종류를 담을 배열 : String[] beverage
- 음료의 가격을 담을 배열 : int[] price
- 주문 수량을 담을 배열 : int[] numberOfOrders
- 개별 주문금액을 담을 배열 : int[] amountOfMoney
- 주문 수량을 변수 : int numbers
- Y or N 진행 여부 변수 : int continuingOrNot
- 총 판매금액을 담을 변수 : totalPaymentAmount
- 총 주문 수량을 담을 변수 : totalOrderAmount
- 음료 선택 : int beverageChoice
*2)
조건문 : 주문 여부(yes/no) - if ~ else
주문을 판단해서 처리기 : if ~ else if ~ else, switch
*3)
반복문 : 주문 여러번 받을 수 있기에 - while(true), do ~while, for(;;){}
*4)
메소드
여러번 노출되는 것(반복된 규칙)
*** 복잡한 프로그램보다, 조원들이 잘아는 것을 하는것이 코드가 잘나온다.
면접볼때, 완성된것을 보겠는가? 코드를 보겠는가? ★★★ 코드를 본다.
정말 잘아는것, 많이 볼수있는 것을 하는 것을 하고
그것들을 변형하고 리팩토리, 업그레이드 시킨다면,
훨씬 좋은 코딩이 된다.
'1. JAVA > 3). 자바_개념' 카테고리의 다른 글
자바_개념_Day_15 (0) | 2024.01.19 |
---|---|
자바_개념_Day_14 (0) | 2024.01.18 |
자바_개념_Day_12 (0) | 2024.01.16 |
자바_개념_Day_11 (0) | 2024.01.15 |
자바_개념_Day_10 (0) | 2024.01.12 |