this

  this는 현재 클래스의 인스턴스, 지금 실행상태에 있는 인스턴스의 특정 필드를 지정할 때 사용한다.

class Test{
   int age;
   
   public void setAge(int age){
      this.age = age;
   }
}

  다른객체에서 Test test = new Test();

  test.setAge(20);

  이라고 하면 위에있는 setAge(int age);가 작동한다.

  setAge(int age); 메소드를 보면 파라미터로 전달된 int의 이름인 age와 Test 클래스의 필드값이 age가

  같은 이름이기 때문이다.

 

  this.age는 '이 age는 지금 메소드(setAge)의 파라미터인 age 값이 아니라 클래스의 필드인 age다' 라는 것을

  의미한다.

  그리고 문장이 메소드안에 존재하더라도 age는 클래스의 필드임을 확실히 해두기 위해서도 사용한다.

 

  this는 인스턴스가 만들어지기 전에 이미 시작을 하기 때문에 static한것에서는 사용할 수 없다. 

 

this();

  생성자를 부르기 위해서 사용된다.

class Person{
   int age;
   String name;
   String address;
   
   public Person(){
      this(0, null, null);
   }
   
   public Person(int age){
      this(age, null, null);
   }
   
   public Person(int age, String name){
      this(age, name, null);
   }
   
   public Person(int age, String name, String address){
      this.age = age;
      this.name = name;
      this.address = address;
   }
}

  한 사람에 대한 나이, 이름, 주소를 저장하는 클래스인데 생성자를 살펴보면 점차 파라미터(넘겨받는 값)이 늘어난다.

 

  다른 클래스에서

  1. Person jane = new Person(23, "jane", "America");

  2. Person jane = new Person(23, "jane");

  3. Person jane = new Person(23);

  4. Person jane = new Person();

 

  위와 같이 다양한 방법으로 인스턴스를 생성할 수 있도록 여러종류의 생성자를 마련했을 때 this();가 유용하게

  쓰일 수 있다.

  생성자끼리도 서로가 서로를 호출 할 수 있는(객체지향에서는 메시지를 전달) 방법이 this()를 활용하는 것이다.

  2,3,4번 모두 첫번째를 호출해서 인스턴스를 만들게 된다.

  

super

  super는 자식클래스가 부모 클래스로부터 상속받은 멤버를 참조할 때 사용한느 참조 변수이다.

  클래스 내의 멤버변수와 지역변수의 이름이 같을 경우 구분을 위해 this를 사용하듯이 부모클래스와 자식클래스의

  멤버 이름이 같은 경우 super를 사용한다.

  this와 super는 인스턴스의 주소값을 저장하는데 static메소드(클래스메소드)와는 무관하게 사용된다.

class JavaApp {
   public static void main(String[] args) {
      Child child = new Child();
      child.childMethod();
   }
}

class Parent {
   int x = 10;
}

class Child extends Parent {
   int x = 20;
   
   void childMethod() {
      System.out.println("x=" + x);
      System.out.println("this.x=" + this.x);
      System.out.println("super.x=" + super.x);
   }
}

  위 예제 실행 시 다음의 결과가 출력된다.

x=20
this.x=20
super.x=10

 

super()

  super()는 부모클래스의 생성자를 호출하는 메소드이다. 상속받은 자식 클래스가 부모클래스의 멤버를 사용할 경우가

  있을수도 있으므로 부모클래스를 우선적으로 초기화해줘야 한다. 부모클래스의 생성자는 자식 클래스의 생성자 

  첫줄에서 호출해준다. 이러한 부모클래스에 대한 생성자 호출은 상속관계에 따라 Object클래스까지 올라가서

  마무리된다.

 

  Object클래스를 제외한 모든 클래스의 생성자의 첫줄에는 반드시 자신의 클래스의 또다른 생성자, this() 또는

  부모클래스의 생성자, super()를 호출해줘야 한다.

  이렇게 하지 않으면 컴파일러가 자동으로 super()를 생성자의 첫줄에 호출한다.

class JavaApp {
   public static void main(String[] args) {
      Point3D point3d = new Point3D();		//Point3D() 생성자로 초기화 및 인스턴스 생성
      System.out.println("point3d.x=" + point3d.x);
      System.out.println("point3d.y=" + point3d.y);
      System.out.println("point3d.z=" + point3d.z);
   }
}

class Point {
   int x = 10;
   int y = 20;
   
   Point(int x, int y) {
   		//생성자의 첫줄에 다른 생성자를 호출하지 않았기 때문에,
        //컴파일러가 이 부분에 super()를 호출한다.
        //부모클래스이므로 Object 클래스의 super()가 호출된다.
      this.x=x;
      this.y=y;
   }
}

class Point3D extends Point {
   int z = 30;
   
   Point3D() {
      this(100, 200, 300);		//자신의 클래스의 또다른 생성자 호출
   }
   
   Point3D(int x, int y, int z) {
      super(x, y);		//부모클래스 생성자 호출
      this.z = z;
   }
}

  위 예제 실행시 다음의 결과가 출력된다.

point3d.x=100
point3d.y=200
point3d.z=300

 

  this와 super를 여러개 사용하고 싶으면 생성자에서 일반 메소드를 호출하도록 만들어주면 된다.

  중복적인 로직을 가지는 코드 구문이 나온다면 메소드화 시켜 호출해서 사용하도록 만들어 준다.

 

  this나 super를 사용하는 이유중에서는 동일한것을 호출해서 사용하고 싶었기 때문에 사용하는 것이다.

  두개를 같이 처리하고 싶은 경우에 같이 적을 수 없기 때문에 일반 메소드를 만들어서 그것을 생성자에서 호출하도록

  만들어 주는것이다.

 

  기초클래스가 갖고있는 동일한 변수값을 갖고오고 싶으면 super를 사용하면 된다.

  기초클래스는 서브클래스가 몇개가 있던 상관없지만 기초클래스가 서브클래스에서 가져올 수는 없다.

  갖고 있는것을 가져올때는 this를 사용하면 되고 기초클래스에서 가져오고 싶을때는 super를 사용하면 된다.

  생략이 되어 있다면 그것은 무조건 this라고 생각하면 된다.

 

  기초클래스에도 있고 서브클래스에도 있는건 중복된 것이 아닌 overriding이다

  서브클래스는 기초클래스를 상속받기 때문에 서브클래스에 없고 기초클래스에 있는 것은 this를 붙여서 사용할수 있다.

 

  외부에서는 getter, setter를 이용하지만 서브클래스에서는 그냥 사용 할 수 있게 하고 싶다면

  protected로, 서브클래스에서도 getter, setter 이용해서 사용하게 하고 싶으면 private으로 해주면 된다.

  

  동일한 패키지 내에서는 인스턴스를 이용해 접근이 가능하다.

  기초클래스에서 private으로 되어있다면 getter, setter로 가져와야 하는데 출력문에서 get000()으로 사용하면

  출력이 가능하다.

  이것은 this.get000()과 같은것이다.

 

  굳이 super라고 쓰지 않은것은 private일 때는 super를 붙여봤자 안되기 때문이다.

'JAVA' 카테고리의 다른 글

REST  (0) 2020.05.19
배열(Array)  (1) 2020.05.08
접근제어자  (0) 2020.05.08
제어문, 반복문 예제  (1) 2020.04.30
반복문  (1) 2020.04.29

제어자(modifier)

  제어자(modifier)란 클래스와 클래스 멤버의 선언 시 사용하여 부가적인 의미를 부여하는 키워드를 의미한다.

  자바에서 제어자는 접근제어자(access modifier)와 기타 제어자로 구분할 수 있다.

 

  기타제어자는 경우에 따라 여러개를 함께 사용할 수도 있지만, 접근 제어자를 두개 이상 같이 사용할 수는 없다.

  이러한 접근 제어자와 기타 제어자는 조합에 따라 함께 사용할 수 있다.

 

접근제어자(access modifier)

  객체지향에서 정보은닉(data hiding)이란 사용자가 굳이 알 필요가 없는 정보는 사용자로부터 숨겨야 한다는 개념이다.

  그렇게 함으로써 사용자는 언제나 최소한의 정보만으로 프로그램을 손쉽게 사용할 수 있게 된다.

 

  자바에서는 이러한 정보은닉을 위해 접근제어자(access modifier)라는 기능을 제공한다.

  접근제어자를 사용하면 클래스 외부에서의 직접적인 접근을 허용하지 않는 멤버를 설정하여 정보은닉을 구체화

  할 수 있다.

  자바에서는 다음과 같은 네가지의 접근제어자를 제공한다.

 

  1. private

  2. public

  3. default

  4. protected

private

  private을 사용하여 선언된 클래스 멤버는 외부에 공개되지 않으며, 외부에서는 직접 접근 할 수 없다.

  즉, 자바프로그램은 private 멤버에 직접 접근할 수 없으며, 해당 객체의 public 메소드를 통해서만 접근할 수 있다.

  따라서 private 멤버는 public 인터페이스를 직접 구성하지 않고, 클래스 내부의 세부적인 동작을

  구현하는데 사용된다.

  private 멤버는 해당 멤버를 선언한 클래스에서만 접근 할 수 있다.

 

Public

  public을 사용하여 선언된 클래스 멤버는 외부로 공개되며, 해당 객체를 사용하는 프로그램 어디에서나 직접 접근할 수

  있다. 자바 프로그램은 public 메소드를 통해서만 해당 객체의 private 멤버에 접근할 수 있다.

  따라서 public 메소드는 private 멤버와 프로그램 사이의 인터페이스(interface)역할을 수행한다고 할 수 있다.

  public 멤버는 프로그램 어디에서 누구나 접근할 수 있다.

 

Default

  자바에서는 클래스 및 클래스 멤버의 접근 제어의 기본값으로 default 접근제어를 별도로 명시하고 있다.

  이러한 default를 위한 접근 제어자는 따로 존재하지 않으며, 접근제어자가 지정되지 않으면 자동적으로 default 접근

  제어를 가지게 된다.

  default 접근 제어를 가지는 멤버는 같은 클래스의 멤버와 같은 패키지에 속하는 멤버에서만 접근 할 수 있다.

  default 멤버는 같은 패키지에 속하는 클래스에서만 접근할 수 있다.

 

Protected

  자바클래스는 private 멤버로 정보를 은닉하고, public 멤버로 사용자나 프로그램과의 인터페이스를 구축한다.

  여기에 부모클래스(parent class)와 관련된 접근제어자가 하나 더 존재한다.

  protected 멤버는 부모 클래스에 대해서는 public 멤버처럼 취급되며, 외부에서는 private멤버처럼 취급된다.

 

  클래스의 protected멤버에 접근할 수 있는 영역은 다음과 같다.

  1. 이 멤버를 선언한 클래스의 멤버

  2. 이 멤버를 선언한 클래스가 속한 패키지의 멤버

  3. 이 멤버를 선언한 클래스를 상속받은 자식 클래스(child class)의 멤버

 

  protected멤버는 같은 패키지에 속하는 클래스와 다른패키지에 속하는 자식클래스에서만 접근할 수 있다.

 

static

  주의점

    static method { => 인스턴스가 만들어지기 전에 인식

       static member oooo(사용가능)

       nonstatic memberxxxx(사용할 수 없다)

       => 이유 : 인스턴스(nonstatic member)가 만들어지기 전에는 nonstatic member를 인식하지 못한다.

 

  Static Method는 객체의 생성없이 호출이 가능하며, 객체에서는 호출이 불가능하다.

  일반적으로는 유틸리티 관련 함수들은 여러번 사용되므로 static 메소드로 구현을 하는것이 적합한데,

  static변수에 접근하기 위한 메소드는 반드시 static 메소드가 되어야 한다.

 

  인스턴스에 공통적으로 사용해야 하는 것에 static을 붙인다.

     인스턴스를 생성하면, 각 인스턴스들은 서로 다른 메모리들의 주소를 할당 받기 때문에 서로 다른

     값을 유지한다. 하지만 인스턴스들의 공통적인 값이 유지되어야 하는 경우에는 static을 붙인다.

  전역으로 자주 사용할 메소드를 static메소드로 만들어서 사용한다.

     프로젝트 내에서 공통적으로 사용해야할 메소드가 있으면 static메소드로 만들어서 불필요한 

     코드의 수를 줄인다. 이 때 인스턴스 변수가 메소드 내부에 필요한가에 대해서도 고려해야한다.

 

 

final

  final 키워드는 Entity를 한번만 할당한다. 즉, 두번이상 할당하려 할 때 컴파일 오류가 발생하여

  확인이 가능하다.

 

  변수에도 붙일 수 있다.

  ex) 변수가 변수의 성격을 갖지 못한다. '절대 변할 수 없는 것을 만들고 싶다'라고 할때 사용한다.

       상수화 시키는것. constant

  

  class에 final이 붙으면 자식클래스를 받을 수 없다. 상속을 못한다는 것이다.

  자식클래스가 변하는걸 막기위해 사용한다.

  잘못 사용하면 값의 변화가 심하게 오는 클래스는 상속 가능하게 만들면 안되기 때문에,

  그때 final을 사용한다.

  String 클래스는 final이다.

  PI는 일반적인 변수가 아니라 상수이기 때문에 전부 대문자로 작성한다.

  override(재정의) : 처리과정이 다른것이다. 부모클래스가 갖고 있는 메소드를 하위 클래스에서 동일한 이름의

                          메소드가 있는데 이름을 바꿔서 쓰는것이다.

  final이 선언된 메소드는 자식 클래스에서 재정의하려 할 때 컴파일 오류가 발생한다.

  클래스를 구현 시 명시적으로 Override Method를 막고 싶을 때 사용하면 좋다.

 

  함수에 대한 final은 단순하다. 상속되면 절대 안되는 경우 final을 정의한다.

  ISP(Interface Segregation Priciple)에 따라 인터페이스를 선언하여 구현한다면 final을 사용하는 경우가

  매우 한정적이다.

     Interface에서 정의한 변수는 final 선언과 같이 재정의가 불가능하다.

     Interface에서 Method를 final로 선언 할 수 없다.

  

  결국 Interface로 정의 후 상속받은 구현체의 메소드에 final을 선언하여 추가적인 재정의를 막는 경우에 final 사용이

  가능하다.

  

  클래스, 함수, 변수가 변하지 못하도록 의도하고 싶다면 final을 사용하면 된다.

 

'JAVA' 카테고리의 다른 글

배열(Array)  (1) 2020.05.08
this, this(), super, super()  (1) 2020.05.08
제어문, 반복문 예제  (1) 2020.04.30
반복문  (1) 2020.04.29
제어문(feat. 삼항연산자)  (1) 2020.04.28

1.  국어 영어 수학 0~100사이여야 한다.

             총점 평균

             등급 A       90~100

                    B       80~90

                    C       70~80

                    D       60~70

                    F         0~60

                    *         0~100 아닐때

결과

이름    국어       영어      수학       총점       평균       등급

이말자  90         100       90          280        93.33      A

 

1-1)  if

public class Ex1_1 {
	public static void main(String[] args) {
		String name = "이말자";
		int kor = 90;
		int eng = 100;
		int math = 90;
		int sum = kor + eng + math;
		double average = sum / 3.;
		String resultString = "";
		if (average >100) {
			System.out.println("잘못된 입력입니다.");
			return;
		}else if (average >= 90) {
			resultString = "A";
		} else if (average >= 80) {
			resultString = "B";
		} else if (average >= 70) {
			resultString = "C";
		} else if (average >= 60) {
			resultString = "D";
		} else if (average < 60) {
			resultString = "F";
		}
		System.out.printf("이름	국어	영어	수학	총합	평균	등급	\n%s	%d	%d	%d	%d	%.2f	%s", 
				name, kor, eng, math,
				sum, average, resultString);{
					
				}
	}
}

 

 

1-2)  switch~case 사용

public class Ex1_2 {
	public static void main(String[] args) {
		String name = "이말자";
		int kor = 90;
		int eng = 100;
		int math =100;
		int sum = kor + eng + math;
		double average = sum / 3.;
		String grade = "입력오류";
		
		switch((int)average/10) {
		
		case 9 :
			grade = "A";
			break;
		case 8 :
			grade = "B";
			break;
		case 7 :
			grade = "C";
			break;
		case 6 :
			grade = "D";
			break;
		case 5 :
		case 4 :
		case 3 :
		case 2 :
		case 1 :
		case 0 :
			grade = "F";
			break;
		
			}
		
			System.out.printf("이름	국어	영어	수학	총합	평균	등급	\n%s	%d	%d	%d	%d	%.2f	%s", 
				name, kor, eng, math,
				sum, average, grade);
			//https://coding-factory.tistory.com/130형변환 캐스팅 방법
	}
}

 

2. 다음과 같이 출력한다.

           2-1)      ★★★★★★

                              ★★★★★

                              ★★★★

                              ★★★

                              ★★

                             

          

public class Ex2_1 {
	public static void main(String[] args) {
			
		for(int count = 1; count <= 6; count++) {
			String stars = "";
			for(int col = count; col <= 6; col++) {
				stars += "★";
				
			}
			System.out.println(stars);
		}
	}
	
}

2-2)

                     ★★

                     ★★★

                     ★★★★

                      ★★★★★

                     ★★★★★★

public class Ex2_2 {
	public static void main(String[] args) {
		
		for(int count = 1; count <= 6; count++) {
			String star = "";
			for(int col = 1; col <= count; col++) {
				star += "★";
			}
			System.out.println(star);
		}
	}
	
}

 

3. 다음과 같이 출력

3-1)

           1   2   3   4   5

           6   7   8   9   10

           11 12 13 14 15

 

public class Ex3_1 {
	public static void main(String[] args) {
		int[][] arr = new int[5][5];
		int num = 1; 
		for(int i = 0; i < arr.length; i++) {
		for(int j = 0; j < arr[0].length; j++) {
			arr[i][j] = num;
			System.out.print(arr[i][j]+" ");
			num++;
		}
			System.out.println();
		}
	}
}

3-2)

A~z까지 출력

옆으로 출력 개행 하지 말고

 

public class Ex3_2 {
	public static void main(String[] args) {
	char aString = 65;
	
	
	while(true) {
	
		if(aString == 91)
			aString = 97;
		
		

		String str = String.valueOf(aString);
		
		System.out.print(str);
		

		aString++;
		
		
		if(aString > 122)
			break;
		
	}
	}

}

3-3)A~z까지 출력

ASC||코드에서 대문자와 소문자 사이에 있는 특수문자를 빼고 출력해라.

A~Z출력하고

개행하고

a~z출력

public class Ex3_3 {
	public static void main(String[] args) {
	char aString = 65;

	
	while(true) {
	
		if(aString == 91)
			aString = 97;
		
		

		String str = String.valueOf(aString);
		
		System.out.print(str);
		
	
		aString++;
		
	
			
		if(aString > 90)
			if(aString < 97)
				System.out.println("");
		if(aString > 122)
			break;
	}
	}

}

 

 

 

3-4)      ABCDEF

           GHIJKL

MNOPQR

STUVWX

YZ

abcdef

ghijkl

mnopqr

stuvwx

yz

 

public class Ex3_4 {
	public static void main(String[] args) {
		char[] arr = new char[53];
		int j = 65;
		for(int i = 1; i<53; i++) {
			arr[i-1] = (char)j;
			System.out.print(arr[i-1]);
			j++;
			
			if(j == 91)
				j =97;
			
			
			if(i%5 == 0) System.out.println("");
			
			if(j > 91)
				if(j < 98) 
					System.out.println("");
				
			if(j > 122)
				break;
			
		}
	}
}

 

3-5) 구구단 4 출력

             4

           4 X 1 = 4

           .

           .

           .

           .

           4 X 9 = 36

 

 

public class Ex3_5 {
	public static void main(String[] args) {
		int i = 4;
		System.out.println("["+i+" 단]");
		
		for(int j = 1; j <=9 ; j++) {
			System.out.println(i+"X"+j+"="+(i*j));
		}
		}
	}

 

3-6) 구구단을 출력하세요

             2

 

             3

 

             4

 

           .

           .

           .

           .

             9

 

public class Ex3_6 {
	public static void main(String[] args) {
		for(int i = 2; i <= 9; i++) {
			System.out.print("["+i+" 단]\t");
		
		for (int j = 1; j <= 9; j++) {
			System.out.print(i+"x"+j+"="+(i*j)+"\t");
		}
		System.out.println();
		}
	}
}

3-7) 구구단을 출력하세요

             2         3        4        ~~~~~~ 9

2X1=2   3X1=3   4X1=4              9X1=9

.

.

.

.

2X9=18  3X9=27 4X9=36  9X9=81

 

public class Ex3_7 {
	public static void main(String[] args) {
		for(int i = 2; i <= 9; i++) {
			System.out.print("["+i+" 단]\t");
		}
		System.out.println();
		
		for(int i = 1; i <= 9; i++) {
			for (int j = 2; j <= 9; j++) {
			System.out.print(j+"x"+i+"="+(i*j)+"\t");
		}
		System.out.println();
		}
	}
}

 

 

3-8) 구구단을 출력하세요

             2         3       

2X1=2   3X1=3   .

.

.

.

2X9=18  3X9=27

4                      5

4X1=4   5X1=5

.

.

.

4X9=36  5X9=45

.

.

.

9단까지 표현.

 

public class Ex3_8 {
	public static void main(String[] args) {

		for (int i = 2; i <= 9; i += 2) {
			System.out.println("["+i+"단]\t\t"+"["+(i+1)+"단]");
			for(int j = 1; j <= 9; j++) {
				System.out.printf("%d x %d = %d\t", i,j,i*j);
				System.out.printf("%d x %d = %d\t", i+1, j, (i+1)*j);
				System.out.println();
			}
			System.out.println();
		}

	}
}

 

3-9) 201 202  203 204

      101 102 103 104

출력

 

public class Ex3_9 {
	public static void main(String[] args) {

		int a  = 300;
		
		for(int i = 0; i < 2; i++) {
			for(int j = 1; j < 5; j++) {
				System.out.print(++a + "\t");
			}
			a = a - 104;
			System.out.println();
			
		
				}
			}
			
		}

3-10)        4! 구하라.

4x3x2x1

public class Ex3_10 {
	public static void main(String[] args) {
		int n = 4;
		int k = 1;
		for(int i = n; i >= 1; i--) {
			k = k*i;
	
			
		}
				System.out.println(n + "! = "+ k);
	
			
	}
}

 

3-11)      345,780

 

             10만원권 3

             5만원권 0

             1만원권 4

             5천원권 1

             1천원권 0

             5백원권 1

             1백원권 2

             5십원권 1

             1십원권 3

 

public class Ex3_11 {
	public static void main(String[] args) {
		int t = 345780;
		int i = t / 100000;
		t = t % 100000;
		if(t > 0) System.out.println("10만원권 : "+i);
		i = t / 50000;
		t = t % 50000;
		if(t > 0) System.out.println("5만원권 : "+i);
		i = t / 10000;
		t = t % 10000;
		if(t > 0) System.out.println("1만원권 : "+i);
		i = t / 5000;
		t = t % 5000;
		if(t > 0) System.out.println("5천원권 : "+i);
		i = t / 1000;
		t = t % 1000;
		if(t > 0) System.out.println("1천원권 : "+i);
		i = t / 500;
		t = t % 500;
		if(t > 0) System.out.println("5백원권 : "+i);
		i = t / 100;
		t = t % 100;
		if(t > 0) System.out.println("1백원권 : "+i);
		i = t / 50;
		t = t % 50;
		if(t > 0) System.out.println("50원권 : "+i);
		i = t / 10;
		t = t % 10;
		if(t >= 0) System.out.println("10원권 : "+i);

		
	}
}

 

3-12) 생년월일     이용

             현재 년월일        이용

             살았나 계산

             , 원시적으로. api사용하지 않고

 

결과폼

 

             오늘은 2020.01.23 입니다 당신의 생일은 2020.01.20 이므로 3일살았습니다.

import java.util.*;
import java.text.*;
public class Ex3_12 {
	public static void main(String[] args) {
		
		Date today = Calendar.getInstance().getTime();
		SimpleDateFormat yearFormat = new SimpleDateFormat("yyyy");
		SimpleDateFormat monthFormat = new SimpleDateFormat("MM");
		SimpleDateFormat dayFormat = new SimpleDateFormat("dd");
		
		Scanner sc = new Scanner(System.in);
		
		int currYear = Integer.parseInt(yearFormat.format(today));
		int currMonth = Integer.parseInt(monthFormat.format(today));
		int currDay = Integer.parseInt(dayFormat.format(today));
		
		int birthYear = 0;
		int birthMonth = 0;
		int birthDay = 0;
		
		int dayCount = 0;
		
		System.out.print("태어난 년을 입력하세요 : ");
		birthYear = sc.nextInt();
		
		System.out.print("태어난 웡을 입력하세요 : ");
		birthMonth = sc.nextInt();
		
		System.out.print("태어난 일을 입력하세요 : ");
		birthDay = sc.nextInt();
		
		dayCount = currDay - birthDay;
		
		dayCount = dayCount + ((currMonth * 30) - (birthMonth * 30));
		
		dayCount = dayCount + ((currYear * 365) - (birthYear * 365));
		
		
		System.out.println("당신의 생일은 "+birthYear+"/"+birthMonth+"/"+birthDay+" 이므로 "+dayCount+"일 살았습니다.");
		
		
		
	}

}

'JAVA' 카테고리의 다른 글

this, this(), super, super()  (1) 2020.05.08
접근제어자  (0) 2020.05.08
반복문  (1) 2020.04.29
제어문(feat. 삼항연산자)  (1) 2020.04.28
별찍기, 구구단, 화폐단위 계산  (1) 2020.04.28

for문

for( ; 조건식 ; ){
	반복할 것들
}

   조건을 만족하면 계속 반복하라는 의미이다.

 

while문

while(조건식){
	반복할 것들 (반복할 문장이 하나면 {}는 안해줘도 된다.)
}

 

 

for문을 사용해서 ★ 10개 찍기.

public static void main(String[] args) {
		//for(카운트변수 선언; 변수 10 비교; 변수증가) {
		//★을 찍는다. 옆으로, 개행은 하지 않고.
		//}
		for(int count = 1; count <= 10; count++) {
			//int count = 1; count < 10;
			//이렇게 작성하면 별이 9개만 찍힌다.
			//10개를 찍고싶으면
			//<=로 바꾸거나 11로 바꾸거나 0으로 바꾸면 된다.
			System.out.println("★");
		}
		System.out.println();
		for(int count = 1; count < 11; count++) {
			System.out.println("★");
		}
		System.out.println();
		for(int count = 1; count <= 10; count++) {
			System.out.println("★");
		}
		System.out.println();
		for(int count = 0; count < 10; count++) {
			System.out.println("★");
		}
	}

for문도 중첩이 가능하다.

for(){
	for(){
    	for(){
        }
    }
}

이런식으로.

 

중첩 for문은 예를 들어서 처음 for문에서 3을 주고 두번째에서 5를 주면

두번째 for문은 총 15번을 반복하게 된다.

 

★★★★

★★★★

★★★★

이렇게 출력해보자.

	public static void main(String[] args) {
		for(int count = 1; count <= 3; count++) {
			System.out.println(count+"★★★★");
			
		}
		for(int col = 1; col <= 4; col++) {
			System.out.println("★");
		}
            for(int count = 1; count <= 3; count++) {
			for(int col = 1; col <=4; col++) {
				System.out.print('★');
		}
			System.out.println();

	}

두번째 코드처럼 작성하는 경우에는 별을 하나 찍을 때 마다 개행을 하기 때문에 한줄에 별이 하나씩만

찍히게 된다.

마지막 for문은 중첩으로 한번 for문이 실행 될 때마다 맨 아래 개행을 한번씩 갔다오기 때문에

4개씩 3줄이 출력이 되게 되는것이다.

 

 

'JAVA' 카테고리의 다른 글

접근제어자  (0) 2020.05.08
제어문, 반복문 예제  (1) 2020.04.30
제어문(feat. 삼항연산자)  (1) 2020.04.28
별찍기, 구구단, 화폐단위 계산  (1) 2020.04.28
메모리구조 용어정리  (1) 2020.04.28

제어문은 프로그램의 흐름을 제어한다.

 

무조건 내가 원하는 수만큼 반복하는것은 for문이다.

continue는 계속 반복, break는 반복을 끝내는 것이다.

 

while문은 조건에 맞으면 계속 반복하고 만족하지 않으면 빠져 나온다.

 

if문의 가장 기본적인 패턴은

  if(조건식){

    결과가 true일 때 실행할 문장 또는 실행할 것들

  }

    결과가 truefalse던 공통적으로 처리해야 할 것들

 

            혹은

  if(조건식){

    결과가 true일 때 실행할 문장 또는 실행할 것들

  }else{

    결과가 false일 때 실행할 문장 또는 실행할 것들

  }

    결과가 truefalse던 공통적으로 처리해야 할 것들

 

이렇게 작성한다.

만약 {}가 없다면 문장 하나만 실행하는 것이다.

 

중첩 if문은 if문안에 또다른 if문이 있는것이다.

 

  if(조건식1){

   조건식 1true일 때 실행할 문장 또는 실행할 것들

  }else if(조건식 2){

    조건식 1false인데 조건식 2true일 때 실행할 문장 또는 실행할 것들

  }else{

    조건식 12 모두 false일 때 실행할 문장 또는 실행할 것들

 

            혹은

   if(조건식1){

       if(조건식2){  // 조건식 1이 true라면 조건식 2의 if문 실행

          조건식 1true이면서 조건식 2true 일때 실행할 문장 또는 실행할 것들

       }else{

           조건식 1true지만 조건식 2false일때 실행할 문장 또는 실행할 것들

   }else{

     조건식 1false일때 실행할 문장 또는 실행할 것들

 

이렇게 사용이 가능하다.

	public static void main(String[] args) {
		int a = 4;
		String resultString;
		// String이 문자를 문자열화 시켜주기 때문에 사용.
		if(a < 0) {
			//a = 4이므로 0보다 작은 음수이다.
			resultString = "작은음수";
		}else {
			resultString = "큰 양수";
		}//else end
		//공통적으로 처리할 자리
			System.out.println("a="+a+"이므로 0보다 "+resultString+"입니다");
	}

if문 내에서도 계속 print를 하는 방법도 있지만 여러번 쓰지않고 위의 코드처럼 resultString에 값을 잡아주고

제어문이 끝난뒤에 결과값에 따라 값이 다르게 나오도록 할 수 있다.

 

위 코드처럼 단순한 제어문이라면 else도 작성하지 않고 같은 값을 출력 시킬 수 있다.

	public static void main(String[] args) {
		int a = 4;
		String resultString = "큰 양수"; //else의 조건에 맞는 resultString값
		
		if(a < 0) {
			//a = 4 이므로 0보다 작은 음수이다.
			resultString = "작은 음수";
		}
		//공통적으로 처리할 자리
		System.out.println("a = "+a+"이므로 0보다"+resultString+"입니다");
	}

if는 사용해야 하니까 조건이 false가 되었을 때의 값을 먼저 resultString에 넣어주고

true일 때 값을 조건문에 넣어줘서 값이 true가 되었을 때 값이 변경되도록 해주면

else를 쓰지 않아도 같은 결과를 출력 할 수 있다.

 

다중 if문을 사용해서 a가 0보다 크면 양수, 0보다 작으면 음수, 양수도 음수도 아니면 0이다 라는 값을 출력하려면

	public static void main(String[] args) {
		int a = 4;
		String resultString = "양수"; //else 일때의 값
		
		if(a < 0) {
			resultString = "음수"; //a가 0보다 작을때
		}else if(a == 0) { //a가 0보다 작지 않을 때 체크
			resultString = "0과 같은값"; //a가 0보다 작지 않고 0과 같다면
		}
		System.out.println("a = "+a+"이므로 "+resultString+"입니다");
	}

같은것을 삼항연산자로 작성하면

	public static void main(String[] args) {
		int a = 4;
		String resultString = (a<0)?"작은 음수":"큰 양수"; // (a<0)? true : false
		
		System.out.println("a = "+a+"이므로 0보다"+resultString+"입니다");

 

Switch case

	public static void main(String[] args) {

		switch(정수이거나 문자열의 결과를 내는 연산식) {
		case1:
			// :를 붙이는것은 라벨을 만들어주는것이다.
			break;
			//break가 없다면 true임에도 불구하고 불필요하게 
			//아래 작성되어있는 값들을 모두 계산한다.
			//break는 결과가 true이면 바로 빠져나가라는 의미이다.
		case2 :
			default : //모든 값이 다 false일때
		}
}

case 값의 순서는 break가 작성되어있다면 상관없다.

그리고 사용빈도수가 더 많은 것을 앞쪽에 두는게 속도면에서 효율적이다.

	public static void main(String[] args) {
		int cityCode = 1;
		String cityName;
		
		switch(cityCode) {
		case 1:cityName = "서울";
			break;
		case 2:cityName = "부산";
			break;
		case 3:cityName = "광주";
			break;
			default :cityName = "기타지역";
		}
		System.out.println("도시코드 : "+cityCode+":"+cityName);
}

 

 

'JAVA' 카테고리의 다른 글

제어문, 반복문 예제  (1) 2020.04.30
반복문  (1) 2020.04.29
별찍기, 구구단, 화폐단위 계산  (1) 2020.04.28
메모리구조 용어정리  (1) 2020.04.28
연산자 사용 및 프레임워크, tools, IDE 의 차이점  (1) 2020.04.28

1. 별찍기

public class star{
	public static void main(String[] args){
    	int line = 6;
         for(int i=0; i<line; i++){
         	for (int j=0; j<i; j++){
            	System.out.print("");
            }
            for(int j=0; j<line-i; j++){
            	System.out.print("*");
            }
            System.out.println();
     }
     for(int i=0; i<line; i++){
     	for(int j=0; j<line; j++){
        	if(j<line-i-1)
            	System.out.print("");
            else
            	System.out.print("*");
         }
         System.out.println();
         
     }
   }
}

2. 구구단 출력

public class m1 {
	public static void main(String[] args) {
		for(int i=2; i<10; i=i+2) {
			for(int j=1; j<10; j++) {
				for(int k=i; k<i+2; k++) {
					System.out.print(k+"x"+j+"="+k*j+"\t");
				}
				System.out.println();
			}
			System.out.println();
		}
	}
}

 

3. 화폐단위 계산

public class cash2{
	public static void main(String[] args){
    	int chage = 100000;
        int money = 0;
        int i = 0;
        int total = 345780;
        
        while(true){
        	money = total / change;
            System.out.println(change + "원권 : " + money + "장");
            
            if(chage <= 10){
            	break;
            }
            total = total - change * money;
            
            if(i == 0){
            	change = change / 2;
                i = 1;
                
            }else{
            	change = change / 5;
                i = 0;
            }
        }
    }
}

'JAVA' 카테고리의 다른 글

반복문  (1) 2020.04.29
제어문(feat. 삼항연산자)  (1) 2020.04.28
메모리구조 용어정리  (1) 2020.04.28
연산자 사용 및 프레임워크, tools, IDE 의 차이점  (1) 2020.04.28
빌드(Build)  (1) 2020.04.28

1. 컴파일(Compile)

     원시코드에서 목적코드로 옮기는 과정을 컴파일이라고 한다.

     우리의 언어는 컴퓨터가 이해하지 못하기 때문에 컴퓨터가 이해할 수 있는 통역 역할을 하는것이다.

 

2. 레지스터(Register)

     특정한 목적에 사용되는 일시적인 기억장치.

     데이터를 읽고 쓰는 기능이 매우 빠르며, CPU 내부에 사용된다.

     CPU의 내부에 존재하며 고속 메모리로 요청을 처리하는데 필요한 데이터를 일시적으로 저장하는 공간이다.

 

3. SMA(Static Memory Allocation)

     정적 메모리 할당.

     메모리할당 방법중의 하나로, 메모리의 크기가 하드코딩되어 있기 때문에

     프로그램이 실행될 때 이미 해당 메모리의 크기가 결정되는 것이 특징이다.

 

4. DMA(Dynamic Memory Allocation)

     동적 메모리 할당.

     프로그래밍에서 실행시간 동안 사용할 메모리공간을 할당하는것을 말한다.

     프로그램이 실행하는 순간 프로그램이 사용할 메모리 크기를 고려하여 메모리의 할당이 이루어지는 정적 메모리 

     할당과 대조적이다.

 

5. Stack 영역

     특정 구문 내에서 임시로 할당하는 메모리 영역으로 '{ }'와 같은 브레이스(braces : 중괄호)내에서 유효한

     데이터가 저장된다.

     '{'를 만나면 새로운 Stack영역이 시작되고 '}'를 만나면 생성했던 데이터들이 해제된다.

 

6. 매개변수

     변수의 특별한 한 종류로서, 함수 등과 같은 서브루틴의 input으로 제공되는 여러 데이터중 하나를 기리키기 위해

     사용된다. 보통 매개변수의 목록은 서브루틴의 정의 부분에 포함되며, 매번 서브루틴이 호출 될 때마다 해당

     호출에서 사용된 전달인자들을 각각에 해당하는 매개변수에 대입시켜 준다.

 

7. 재귀함수(Recusive function)

     자기 자신을 다시 호출하는 함수.

 

8. 힙영역(Heap)

     프로그램에서 자유롭게 할당하고 해제할 수 있는 영역.

     힙 영역에 메모리를 할당하거나 해제하려면 명시적으로 함수를 호출해야 한다.

     32bit 운영체제에서는 일반적으로 약 2GByte의 힙 영역을 할당할 수 있으며 OS환경에 따라 크기 차이가 있을 수

     있다. 64bit 운영체제는 이론상 한계치가 있긴 하지만 사실상 제한이 없다고 봐도 된다.

     하지만 힙 영역에 메모리를 할당하고 해제하는 것을 잊어버린다면 메무리누수(Memory Leak)가 생길 수 있다.

     메모리 누수 문제는 프로그램이 실행되는 동안 시스템의 메모리가 계속해서 잠식해나가 결국 시스템에

     치명적인 문제를 일으킬 수 있다.

     따라서 malloc, calloc, new 등의 할당 함수를 통해 힙 영역을 할당 받았다면 반드시 사용 후에

     free, delete 등의 함수로 해제를 해줘야 한다.

 

9. 메모리누수(Memory Leak)

     컴퓨터 프로그램이 필요하지 않은 메모리를 계속 점유하고 있는 현상.

     프로그램이 메모리를 할당 후 해제하지 않아서 시스템의 메모리를 고갈시키는 소프트웨어 오류이다.

 

10. Data영역

     bss, data영역을 묶어서 data영역이라고 한다.

     전역변수, 정적(static)변수, 배열, 구조체 등이 저장되는데 프로그램이 실행될 때 할당되고 종료될 때 해제된다.

     이때 초기화 된 데이터는 data영역에 저장되고 초기화 되지 않은 데이터는 BSS(Block Stated Symbol) 영역에

     저장된다.

 

11. 전역변수

     어느 지역에서나 사용할 수 있는 변수이다.

     전역변수로 선언하면 main함수이든, functionTest함수이든 변수 사용이 가능하다.

     이 전역변수는 프로그램의 시작과 동시에 메모리 공간에 할당되어서 프로그램이 종료될때까지 존재한다.

     또한 지역변수와는 다르게 별도의 값으로 초기화 하지 않으면 0으로 초기화 된다.

 

12. 정적(static)변수

     전역변수의 단점을 부분적으로 보완한 변수가 정적변수이다.

     정적변수는 변수의 자료형 앞에 static 키워드를 넣어 만든다.

     전역변수처럼 프로그램이 종료되지 않는 한 메모리가 소멸되지 않고, 특별히 초기값을 지정하지 않아도 자동으로 

     0을 가진다.

     주의사항으로는 전역변수와 마찬가지로 초기화 할 때 반드시 상수를 초기화 해야 한다.

 

13. BSS(Block Stated Symbol)영역

     .bss나 bss는 초기에 오직 제로값으로 표시된 정적으로 할당 된 변수가 포함된 데이터 세그먼트의 일부로

     컴파일러나 링커에 의해 사용된다.

     즉, 초기화되지 않은 전역 데이터를 위한 영역이다.

     일반적으로 프로그램 로더가 프로그램을 로드할 때 bss영역에 할당 된 메모리를 초기화 한다.

 

14. Code(text)영역

     실제 프로그램 동작을 수행하는 명령어(Instruction)와 전역 상수가 저장된다.

1. 나머지 연산자 % 를 사용하지 말고 나머지를 구하는 연산식은?

 

public static void main(String[] args){
	int x = 10;
    int y = 3;
    int z = x/y;
    
    System.out.printf("%d를 %d로 나눈 나머지 : %d\n", x, y, x-(z*y));
    }

2. &, |, ^ 의 결과 예측. 왜 결과가 그렇게 나오는지 분석.

 

int ff = 4 & 5

int gg = 4 | 5

int hh = 4 ^ 5

   

   4 = 0000 0100

   5 = 0000 0101

 

   & = 0000 0100

     & 연산자는 두 비트 모두 1일때 1을 반환하기 때문에 두 비트 모두 1인 부분만 1이 반환되어서

     0000 0100 으로 출력이 되고 10진수로 다시 변환하면 결과값은 4이다.

 

   | = 0000 0101

     | 연산자는 두 비트중 하나라도 1이 있으면 1을 반환하기 때문에 1이 있는 부분들이 1을 반환하여서

     0000 0101로 출력이 되고 결과값이 5가 나오게 된다.

 

   ^ = 0000 0001

     ^연산자는 두 비트가 달라야 1이 반환되므로 유일하게 다른 끝자리만 1이 반환되어서 

     0000 0001로 출력이 되고 결과값이 1이 나오게 된다.

 

3. 다음 문장을 보고 결과를 예측. 결과의 원인 또는 이유를 명시.

int a = 4;
int b = 5;
int c = ++a + ++b;
int d = ++a + b++;
int e = a++ + b++;
int f = ++a + ++b;
int g = f;
g *= a;

   int c = 11

     a는 선증가이기 때문에 a의 값 4에서 5로 먼저 증가하게 되고 b 역시 선증가 이기때문에

     6으로 증가한 다음 계산이 되어 두 값의 합은 11이다.

   

   int d = 12

     d에서도 a는 선증가이기 때문에 c로 인해 증가한 5에서 한번 더 증가한 6이 되고 b같은 경우는

     후 증가이기 때문에 그대로 6인 상태로 결과값이 먼저 나온다.

     a=6, b=6이기 때문에 결과값은 12가 되고 결과값 도출 후 b는 7로 증가한다.

   int e = 13

     a,b모두 후 증가기 때문에 d의 연산이 끝난 후 증가한 b값인 7을 더해서 13의 결과가 나오고

     결과 도출 후 a,b모두 1씩 증가시켜 a=7, b=8이 된다.

   int f = 17

     a,b모두 선 증가 이므로 a=8, b=9가 되어 17이 된다.

   int g = 136

     g의 값은 f의 값 바로 밑에서 f의 값과 같은 17로 처음 도출된다.

     그러나 그 아래에서 g *= a 로 g값과 a값을 곱해야 하므로 17 * 8 = 136이 최종 g의 값이다.

     *=는 연산자 왼쪽과 오른쪽을 곱한 뒤 왼쪽의 값에 대입시키는 것이다.

 

4. 프레임워크란?

  랄프존슨 교수는 프레임워크를 "소프트 웨어의 구체적인 부분에 해당하는 설계와 구현을 재사용이

  가능하게끔 일련의 협업화 된 형태로 클래스들을 제공하는 것" 이라고 정의했다.

  프레임워크는 라이브러리와 달리 애플리케이션의 틀과 구조를 결정할 뿐 아니라,

  그 위에 개발된 개발자의 코드를 제어한다.

  프레임워크는 구체적이며 확장 가능한 기반 코드를 가지고 있으며, 설계자가 의도하는 여러

  디자인 패턴의 집합으로 구성되어 있다.

  사용자와 실제 구현하고자 하는 기능 사이에, 사용자로 하여금 구현하고자 하는 기능을 

  쉽게 제공해주는 중간계층이며 라이브러리랑 비슷한 점이 있다.

  그런데 구분해서 프레임워크라고 나누는 이유는 프레임워크에는 라이브러리의 뼈대가 되는

  클래스들과 그 클래스들의 관계로 만들어진 일종의 '설계의 기본 틀'이 추가된다는 점이다.

  설계의 틀이라는 말은 '확장 가능한 기반코드나 재사용 가능한 형태의 협업화된 클래스들'

  이라는 말과 같은 뜻이다.

  라이브러리 같은 경우는 설계를 대신 해주지 않고 개발자가 필요한걸 가져다 쓰는 대상이지만

  프레임워크는 프레임워크의 제작자가 만들어 놓은 '기반코드'라는 것이 있다.

  이 코드 혹은 클래스들은 차후 사용자들에 의해 확장 될 것을 충분히 고려해서 만들어졌기 때문에

  이 기반을 가지고 살을 덧붙여 자기만의 프로그램을 완성해 나가면 되는 것이다.

  

  정리하자면 설계의 기반이 되는 부분을 기술한 확장 가능한 기반코드와 사용자가 이 코드를 

  자기 입맛대로 확장하는데 필요한 라이브러리, 이 두가지 요소가 통합되어 제공되는 형태를 말하며,

  사용자가 이를 이용해 일정 수준 이상의 품질을 보장받는 코드를, 비교적 빠른 시간에 완성 및 

  유지보수 할 수 있는 환경을 제공해 주는 솔루션으로 '기본설계나 라이브러리는 제공이 되니

  개발자는 하고싶은 기능 구현에만 전념' 이라는 취지에서 만들어 진것이다.

 

5. tools vs framework vs IDE 차이점

  tools같은 경우는 장치나 시스템에 보다 쉽게 엑세스 하기 위해 사용할 수 잇는 도구 그룹이다.

  코드 라이브러리가 아닌 응용프로그램이다.

 

  framework는 하나에 집중된 기능이 아닌 많은 서비스를 제공하는 큰 라이브러리 또는

  라이브러리 그룹이다.

  종종 작업의 일부를 수행하기 위해 라이브러리 코드는 사용하는 응용프로그램을 작성하는 대신

  자신의 코드를 작성하는 완전한 기반을 제공한다.

 

  IDE는 통합개발환경이다.

  응용프로그램 컴파일 및 디버깅에 대한 추가지원을 제공하는 텍스트 편집기 이다.

 

'JAVA' 카테고리의 다른 글

별찍기, 구구단, 화폐단위 계산  (1) 2020.04.28
메모리구조 용어정리  (1) 2020.04.28
빌드(Build)  (1) 2020.04.28
변수, 상수, 연산자, 초기화, 대입, 선언  (0) 2020.04.28
메모리구조  (0) 2020.04.28

+ Recent posts