public class Person{
//public 클래스의 이름과 파일명은 같아야하고, java파일 안에는 public class가 한개만 존재할 수 있다
private String name; //멤버변수 웬만하면 private로
private int age;
Person(String name, int age) //생성자와 클래스의 이름은 같아야하고 반환하는 값이 있으면 x
//클래스 접근제어 지시자가 public 이면 메소드도 public으로 두는게 논리적으로 좋다.
{
this.name = name;
this.age = age;
}
public void setName(String name)
//단어가 두개일때 첫글자 대문자로(카멜규칙)
{
this.name = name;
}
public String getName()
{
return name;
}
public void setAge(int age)
{
this.age = age;
}
public int getAge()
{
return age;
}
}
//name과 age를 액세스 메소드로 만든
class마다 각각의 파일로 저장(파일 명은 class명과 동일)
패키지화 할 class는 제일 상단에서 packag화 해야한다.(단 한번 가능)
각 파일들을 연결해서 컴파일 해야하기 때문에 class 의 제어연산자를 public으로 변경해야한다.(안하면 default)
호출하는 클래스들은 import선언 해줘야한다.
import선언은 package밑에 선언되어야 한다.
import선언 할 때 packge까지 다 적어서 경로설정을 해야한다.
한줄에 단 하나의 명령어만 들어간다.
javac -d . 파일명.java : 확장자가 java인 모든파일을 패키지까지 포함해 컴파일
java FruitSalesMain3
pause : 넣지 않으면 실행 후 바로 종료됌
확장자를 .bat 로 저장
정보 은닉
모든 클래스는 반드시 특정 패키지 않에 소속되어야한다.
좌표는 반드시 정수로, 음수가 될 수 없다
인스턴스 변수에 static이 붙으면 클래스 변수
static이 붙지 않으면 인스턴스 변수
모든 객체가 공유하는 변수
처음 호출될 때 초기화된다. <> 인스턴스 변수는 객체 생성 new 된 후에 초기화 된다.
인스턴스 변수는 각각 고유한 값을 가지지만 클래스 변수는 모든 인스턴스가 공통된 값을 공유한다. > 처음 호출될 때 초기화되고, 그 이후에는 초기화가 되지 않기 때문에
클래스가 로딩될 때 생성되어, 종료될 때 까지 유지되는 클래스 변수는 public을 붙이면 같은 프로그램 내에서 어디서든 접근할 수 있는 전역 변수가 된다.
인스턴스 변수의 접근법과 다르게 인스턴스를 생성하지 않고 클래스 이름, 클래스 변수명을 통해 접근 가능하다.
class Number
{
public int num1; //> 인스턴스 변수 (satatic안붙음)
public static int num2; //static이 붙은 변수 > 클래스 변수
Number()
{
num1++;
num2++; //num1은 초기화가 되어서 객체마다 다시 증감되지만 num2는 공유하기 때문에 증감되어도, 객체들이 공통적인 값을 가진다.
}
public static void printNumber(){
//static으로 클래스 메소드 = static메소드
System.out.println(num2);
System.out.println(num1);//에러 인스턴스 변수 참조
}
public void pirntNumber()//인스턴스 메소드
{
System.out.println(num1 + " " + num2);
}
}
class NumberMain{
public static void main(String[]args){ //객체 생성
Number n1 = new Number();
Number n2 = new Number();
Number n3 = new Number();
n1.printNumber(); //1,3출력
n2.printNumber(); //1,3출력
n3.printNuber(); //1,3출력
System.out.println(n1.num1); //1출력
System.out.println(n1.num2); //3출력
Sysetem.out.println(Number.num1);//오류
//인스턴스 변수는 클래스이름으로 호출할 수 없다.
n1.num1 = 20;
n3.num1 = 30;
System.out.println(n1.num1);//1출력
System.out.println(n1.printNumber);//20과 3출력
-----------------------------------------------------------------------------------------------------------------------------------
Number.printNumber2();
//에러 -static메소드에서는 인스턴스 메소드를 참조할 수 없으므로
System.out.println(Number.num2);
//클래스 변수는 클래스 이름으로 접근한다 > 가독성
System.out.println(n1.num2);
//위와 같지만 참조변수로 접근이여서 가독성이 떨어짐
Number.printNumber2(); //클래스 이름으로 클래스메소드를 호출하는게 더 가독성이 좋음 - 바로 클래스 변수인것을 알 수 있어서
}
}
static메소드 내에서는 인스턴스 메소드, 인스턴스 변수 참조 x
대신 인스턴스 메소드 안에 클래스 변수 참조 가능
위 식의 현재 인스턴스 변수는 public이므로 class끼리 호출 가능
지금까지 인스턴스 변수(=멤버 변수)를 호출할 때 객체를 만들어 그 주소값을 가지고있는 참조변수 뒤에서 선언했는데, static 변수(=클래스 변수)는 class이름 뒤에서 바로 호출 할 수 있다.
클래스 이름으로 인스턴스 변수 호출은 불가능
참조변수 뒤에 static변수 호출 가능 > 그러나 가독성 떨어짐
클래스 변수는 클래스 이름으로 호출

class Number
{
private String name; //인스턴스 변수
private static int age; //static변수 = 클래스 변수
public void hi()
{
System.out.println(name + " " + age);
//인스턴스 메소드 내에서 클래스 변수 참조 가능
}
public static void bye()
{
System.out.println(name);
//에러 - static메소드 내에서 인스턴스 변수 참조 x
System.out.println(age);
hi();
//hi(); 에서 에러 - static 메소드 내에서 인스턴스 메소드 호출 x
}
}
인스턴스 메소드 내에서 > 인스턴스 변수, 클래스 변수 참조 o
클래스 메소드 내에서 > 클래스 변수 참조 o, 인스턴스 변수 참조 x
지금까지는
main메소드에서 인스턴스 변수를 참조하려면 객체를 생성 > 호출
class SimpleMath // 단순 계산 클래스
{
public static final double PI=3.1415;
public double add(double n1, double n2){ return n1+n2; }
public double min(double n1, double n2){ return n1-n2; }
public double mul(double n1, double n2){ return n1*n2; }
}
class AreaMath // 넓이 계산 클래스
{
public double calCircleArea(double rad)
{
SimpleMath sm=new SimpleMath();
double result=sm.mul(rad, rad);
result=sm.mul(result, SimpleMath.PI);
return result;
}
public double calRectangleArea(double width, double height)
{
SimpleMath sm=new SimpleMath();
return sm.mul(width, height);
}
}
class PerimeterMath // 둘레 계산 클래스
{
public double calCirclePeri(double rad)
{
SimpleMath sm=new SimpleMath();
double result=sm.mul(rad, 2);
result=sm.mul(result, SimpleMath.PI);
return result;
}
public double calRectanglePeri(double width, double height)
{
SimpleMath sm=new SimpleMath();
return sm.add(sm.mul(width, 2), sm.mul(height, 2));
}
}
class HowMethod
{
public static void main(String[] args)
{
AreaMath am=new AreaMath();
PerimeterMath pm=new PerimeterMath();
System.out.println("원의 넓이: "+am.calCircleArea(2.4));
System.out.println("직사각형 둘레: "+pm.calRectanglePeri(2.0, 4.0));
}
}
class SimpleMath // 단순 계산 클래스
{
public static final double PI=3.1415;
public static double add(double n1, double n2){ return n1+n2; }
public static double min(double n1, double n2){ return n1-n2; }
public static double mul(double n1, double n2){ return n1*n2; } //인스턴스 메소드를 참조하는 구문이 없기 때문에 static메소드로 변경 가능
}
class AreaMath // 넓이 계산 클래스
{
public static double calCircleArea(double rad) //인스턴스 참조 x하므로 클래스 메소드로 변경 가능
{
double result=SimpleMath.mul(rad, rad);
result=SimpleMath.mul(result, SimpleMath.PI); //mul을 클래스 메서드로 만들어서 굳이 클래스 이름으로 호출하고 객체 생성 필요 x
return result;
}
public static double calRectangleArea(double width, double height) //statir메소드를 참조하므로 static메소드로 변경 가능
{
return SimpleMath.mul(width, height); //mul을 클래스 명으로 호출하고 객체 생성 필요 x
}
}
class PerimeterMath // 둘레 계산 클래스
{
public static double calCirclePeri(double rad) //인스턴스 변수, 메소드 호출 x로, static메소드로 변경가능
{
double result=SimpleMath.mul(rad, 2);
result=SimpleMath.mul(result, SimpleMath.PI);
return result;
}
public static double calRectanglePeri(double width, double height)
{
return SimpleMath.add(SimpleMath.mul(width, 2), SimpleMath.mul(height, 2));
}
}
class HowMethod
{
public static void main(String[] args)
{
System.out.println("원의 넓이: "+AreaMath.calCircleArea(2.4));
System.out.println("직사각형 둘레: "+PerimeterMath.calRectanglePeri(2.0, 4.0)); //다 클래스 메소드로 변경되어서 클래스 이름으로 호출 가능
}
}
먼저 인스턴스 메소드, 변수를 참조하지 않는 메소드를 찾고 static을 넣는다.
클래스 메소드로 변경시킨 메소드를 참조하는 부분들을 찾아 객체 생성을 삭제하고 클래스 명으로 호출되게끔 수정한다.
이렇게 차례차례로 static화 시키면 된다.
public static final double PI = 3.14;
class Circle{
public static final double PI = 3.14;
double radius = 4;
public double areaOfCircle(){
return PI * radius * radius;
}
}
areaOfCircle메서드를 static으로 변경할수 없다
class Circle{
public static final double PI = 3.14;
public static double areaOfCircle(double radius){
return PI * radius * radius;
}
}
class InstCnt
{
static int instNum=0;
public InstCnt()
{
instNum++;
System.out.println("인스턴스 생성: "+instNum);
}
}
class ClassVar
{
public static void main(String[] args)
{
InstCnt cnt1=new InstCnt();
InstCnt cnt2=new InstCnt();
InstCnt cnt3=new InstCnt();
}
}
cnt1 객체 생성 > instNum(0) 참조 > 증감(1) > 1 출력
cnt2 객체 생성 > instNum 참조(1) > 증감(2) > 2 출력
cnt3 객체 생성 > instNum 참조(2) > 증감(3) > 3 출력
class AccessWay
{
static int num=0;
AccessWay()
{
incrCnt();
}
public void incrCnt(){num++;}
}
class ClassVarAccess
{
public static void main(String[] args)
{
AccessWay way=new AccessWay();
way.num++;//이건 조금 가독성이 떨어짐, 인스턴스 변수인지 클래스 변수인지 알수 없기에
AccessWay.num++;//이게 더 가독성이 좋음 클래스 호출은 무조건 클래스 변수니까
System.out.println("num="+AccessWay.num);
}
}
way객체 생성 > 그 객체 속에 incrCnt메서드 존재 > 메소드 속num++되서 num로 변경 (객체 생성될때 메서드 안에 구문 실행)
다시 main메소드로 돌아와서 way.num++로 num은 2가 되고,
AccessWay.num++;로 num은 3이 되어 3이 출력된다.
class InstCnt
{
static int instNum=100;
//처음에는 0으로 초기화되고, 그 후에 명시적 초기화를 통해 100으로 초기화
public InstCnt()
{
instNum++;
System.out.println("인스턴스 생성: "+instNum);
}
}
class StaticValNoInst
{
public static void main(String[] args)
{
InstCnt.instNum-=15;
System.out.println(InstCnt.instNum);
}
}
class AAA
{
int aaa;
public AAA(int num){ aaa=num; }
public static void main(String[] args)
{
AAA ins1=new AAA(10);
BBB ins2=new BBB(20);
System.out.println("ins1.aaa="+ins1.aaa);//10출력
System.out.println("ins2.bbb="+ins2.bbb);//20출력
}
}
class BBB
{
int bbb; //인스턴스 변수
public BBB(int num){ bbb=num; } //생성자
public static void main(String[] args)
{
AAA ins1=new AAA(11);
BBB ins2=new BBB(22);//본인 클래스 안에서 본인의 객체를 만드는것 가능
System.out.println("ins1.aaa="+ins1.aaa);//11출력
System.out.println("ins2.bbb="+ins2.bbb);//22출력
}
}
class Circle
{
static final double PI=3.1415;
private double radius;
public Circle(double rad){ radius=rad; }
public void showPerimeter() // 둘레 출력
{
double peri=(radius*2)*PI;
System.out.println("둘레: "+peri);
}
public void showArea() // 넓이 출력
{
double area=(radius*radius)*PI;
System.out.println("넓이: "+area);
}
}
class ClassVarUse
{
public static void main(String[] args)
{
Circle cl=new Circle(1.2);
cl.showPerimeter();
cl.showArea();
}
}
넓이 출력 메서드를 클래스 메서드로 변경하고 싶다면
public static void showArea(double radius){}
식으로 radius의 값을 받아와야한다.
class Number{
int num;
}
class NumberMain{
public static void main(String[]args){
System.out.println(Number.num); //인스턴스 변수니까 에러 <> num이 클래스 변수면 가능
Number n1 = new Number();
System.out.println(n1); //객체 생성해서 이렇게 출력
}
}
class Number{
public void hi(){
System.out.pritln("hi");
}
}
class NumberMain{
public static void main(String[]args){
System.out.println(Number.hi()); //인스턴스 메서드 호출 > 에러
}
}

변수에 PI도 들어가는 줄 알았다.

대문자의 존재를...잠시 생각하지 않았다.
Byte 는 첫글자가 대문자니까 클래스가 된다.

char은 덧셈연산을 하게 되면 int로 자동형변환이 일어나 아스키코드값으로 변한다.
1의 문자값이 49인지 몰랐다.
문자 + 문자의 덧셈 결과가 정수값이 되는지 몰랐다

키워드 true 와 True는 다름
우리가 사용하는건 class
System은 변수 이름

)
Max_Num 안되는줄..
대소문자가 구분되므로 우리가 사용하는 건 if키워드고, If는 대문자므로 다르다고 구분 > 실제로 소스코드짤때는 굳이 헷갈리게 사용하지는 않음

d, e는 원래 본래 자료형보다 변환된 자료형이 더 작기때문에 생략 가능

a - byte의 범위를 넘어서 저장 불가
b - char은 반드시 한 개의 문자를 지정해서 초기화해야한다.
현재 문제에는 아무것도 없는것 > ' ' 공백이 존재하면 가능
c - 한 글자만 가능 > 두 글자 이상이면 String
d - 실수형은 double로 자동인식 하기때문에 뒤에 F 붙여줘야한다.
e - 1.4e3f = 1.4 * 10의 3승(2표기법)

c - args 는 변수이름이기 때문에 다르게 줘도 상관 없다.
d - main 앞에는 반드시 반환되는 값이 와야한다.
영어 대소문
A = 65 ~ Z = 90
a = 97 ~ z = 122
숫자
형식문자
\r(13) - 캐리지 리턴
\n(10) - 개행
\t(9)
스페이스(32)
\n은 줄 바꿈할때 사용하는 문자다.
콘솔 출력에서 새로운 줄로 이동하는데 사용
\r은 커서를 현재 라인의 처음으로 이동시키는 문자다
주로 이전의 내용을 덮어쓸 때 사용
싱글톤 패턴은 클래스의 인스턴스가 단 하나만 생성되도록 하는 디자인 패턴
어떤 상황에서든 하나의 인스턴스만을 사용하고자 할 때 유용하다.
호출해서 return 할때마다 객체를 생성하는데, 이 객체를 한번만 생성해서 출력값이 50이 나오게하시오.
main메서드는 변경하지 않는다.
class SimpleNumber
{
int num=0;
private SimpleNumber snInst;
private SimpleNumber() {} // 생성자 private
public void addNum(int n) { num += n; }
public void showNum()
{
System.out.println(num);
}
public static SimpleNumber getSimpleNumberInst()
{
return new SimpleNumber();
}
}
class OnlyOneINstance
{
public static void main(String[] args)
{
SimpleNumber num1 = SimpleNumber.getSimpleNumberInst();
num1.addNum(20);
SimpleNumber num2 = SimpleNumber.getSimpleNumberInst();
num2.addNum(30);
num1.showNum();
num2.showNum();
}
}
class SimpleNumber
{
int num=0;
private static SimpleNumber snInst;
private SimpleNumber() {} // 생성자 private
public void addNum(int n) { num += n; }
public void showNum()
{
System.out.println(num);
}
public static SimpleNumber getSimpleNumberInst()
{
if(snInst == null){
snInst = new SimpleNumber(); //num1의 객체 주소값을 snInst로 넣는
}
return snInst;
}
}
class OnlyOneINstance
{
public static void main(String[] args)
{
SimpleNumber num1 = SimpleNumber.getSimpleNumberInst();
//호출한곳에서 객체가 생성되서 num1이 그 주소값이 들어간다.
num1.addNum(20);
SimpleNumber num2 =SimpleNumber.getSimpleNumberInst();
num2.addNum(30);
num1.showNum();
num2.showNum();
}
}//num1,2를 new로 객체 생성한것이 아니라 주소값만 저장해서 하나의 객체를 참
생성자를 private로 한 이유는 객체를 하나로 제한하기 위해서다.
처음 snInst의 초기값은 null이므로, null일때 객체를 생성하고, null이 아니면 객체를 생성하지 않는if문장을 생성한다.

메모리로 그리면 이렇다.
class SimpleNumber
{
int num=0;
private static SimpleNumber snInst = new SimpleNumber();
//이렇게 static변수에 객체 주소값을 넣으면, 객체의 개수를 하나로 제한하게 된다.
private SimpleNumber() {} // 생성자 private
public void addNum(int n) { num += n; }
public void showNum()
{
System.out.println(num);
}
public static SimpleNumber getSimpleNumberInst()
{
return snInst;
}
}
임의의 문자열을 입력받아 문자열의 갯수 세기
임의의 문자열 두개를 입력받아 두 문자열 합치기
임의의 문자열을 입력받아 문자열을 소문자로 바꾸기
임의의 문자열을 입력받아 문자열을 대문자로 바꾸기
임의의 문자열 5개를 입력받아 알파벳 순으로 정렬
import java.util.Scanner;
class StringTest
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
String str1, str2, str3, str4, str5, str6;
System.out.println("문자열을 입력하세요.");
str1 = sc.nextLine();
System.out.println("문자열을 입력하세요.");
str2 = sc.nextLine();
int num = str2.length();
//length > 문장 길이 개수
System.out.println("str2의 문자열의 길이는 " + num);
System.out.println("str1과 str2의 문자열을 합친 결과는 " + str1.concat(str2));
//concat > 연결
System.out.println("문자열을 입력하시오.(소문자로 바꾸기)");
str3 = sc.nextLine();
System.out.println("문자열을 소문자로 바꾸면 " + str3.toLowerCase());
//toLowerCase > 소문자로 변환
System.out.println("문자열을 입력하시오.(대문자로 바꾸기)");
str4 = sc.nextLine();
System.out.println("문자열을 대문자로 바꾸면 " + str4.toUpperCase());
//toUpperCase > 대문자로 변환
System.out.print("첫 번째 문장을 입력하세요 : "); //AAA (문자 비교하기)
str5 = sc.nextLine();
System.out.print("두 번째 문장을 입력하세요 : ");//BBB
str6 = sc.nextLine();
int num2 = str5.compareTo(str6); //str1 과 str2가 다르면 뺄셈이 일어난다.
//compareTo > 비교
System.out.print(num2);
}
}
문장 길이 개수 : 변수1.length()
문장 연결 : 변수1.concat(변수 2)
소문자로 변환 : 변수1.toLowerCase()
대문자로 변환 : 변수1.toUpperCase()
문장 비교 : 변수1.compareTo(변수2) > 처음 앞글자로 비교
import java.util.Scanner;
class StringTest
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
String str1, str2, str3, str4, str5, temp;
System.out.println("첫번째 문자열을 입력하세요.");
str1 = sc.nextLine();
System.out.println("두번째 문자열을 입력하세요.");
str2 = sc.nextLine();
System.out.println("세번째 문자열을 입력하세요.");
str3 = sc.nextLine();
System.out.println("네번째 문자열을 입력하세요.");
str4 = sc.nextLine();
System.out.println("다섯번째 문자열을 입력하세요.");
str5 = sc.nextLine();
if(str1.compareTo(str2) > 0)
{
temp = str1;
str1 = str2;
str2 = temp;
}
if(str1.compareTo(str3) > 0)
{
temp = str1;
str1 = str3;
str3 = temp;
}
if(str1.compareTo(str4) > 0)
{
temp = str1;
str1 = str4;
str4 = temp;
}
if(str1.compareTo(str5) > 0)
{
temp = str1;
str1 = str5;
str5 = temp;
}
if(str2.compareTo(str3) > 0)
{
temp = str2;
str2 = str3;
str3 = temp;
}
if(str2.compareTo(str4) > 0)
{
temp = str2;
str2 = str4;
str4 = temp;
}
if(str2.compareTo(str5) > 0)
{
temp = str2;
str2 = str5;
str5 = temp;
}
if(str3.compareTo(str4) > 0)
{
temp = str3;
str3 = str4;
str4 = temp;
}
if(str3.compareTo(str5) > 0)
{
temp = str3;
str3 = str5;
str5 = temp;
}
if(str4.compareTo(str5) > 0)
{
temp = str4;
str4 = str5;
str5 = temp;
}
System.out.println(str1 + " " + str2 + " " + str3 + " " + str4 + " " + str5);
}
}
selection sort해주는 것