fun main() {
    val res1 = sum(3,2)
    val res2 = mul(sum(3,2), 3)	//함수의 결과값을 인자로 사용

    val res3 = mul(func(), 3)	//고차함수 사용

    val lambdaSum : (Int, Int) -> Int = {x:Int, y: Int -> x+y}	//람다식을 일반 변수에 할당
    val res4 = lambdaSum(3,2)	//일반 변수에 할당한 람다식은 함수처럼 사용 가능

    val lambdaSum2 : ()-> Unit = { println("lambdaSum2")}	//반환값이 없는 람다식을 변수에 할당

	
    println("res1 : $res1");
    println("res2 : $res2");
    println("res3 : $res3");
    println("res4 : $res4");
    lambdaSum2()
}

fun sum(a: Int, b: Int) = a+b

fun mul(a: Int, b: Int) = a*b

//고차함수 (매개변수가 함수이거나 반환값이 함수)
fun func() : Int {
	return sum(3,2)
}

 

결과 : 

res1 : 5
res2 : 15
res3 : 15
res4 : 5
lambdaSum2

'개발 > Kotlin' 카테고리의 다른 글

코틀린 공부 - 함수(4) - let / run  (0) 2021.08.03
코틀린 공부 - 함수(3)  (0) 2021.08.02
코틀린 공부 - 함수(1)  (0) 2021.08.02
코틀린 기초 5 - object  (0) 2020.06.25
코틀린 기초 - 4(고차함수, 람다)  (0) 2020.06.24

1. 아래의 함수는 모두 동일

//type 1 (기본형)
fun sum(a: Int, b: Int): Int {
	return a+b
}

//type 2 (중괄호와 return 키워드 생략)
fun sum(a: Int, b: Int) : Int = a+b

//type 3 (중괄호와 return 키워드, 반환값 타입 생략)
fun sum(a: Int, b: Int) = a+b

 

2. 매개변수 기본값 설정하기 + 이름으로 인자값 지정하기

    private fun printInfo(name: String, mail: String = "no email", phone: String = "no phone") {
    	//mail과 phone은 인자를 생략하면 기본값이 들어가게 함
        println("name : $name / email : $mail / phone : $phone");
    }
printInfo("A", "test@test.com");
printInfo("B");
printInfo(name="C", mail="test2@test.com");
printInfo(name="D", phone="010-0101-0520");

위와 같은 코드를 실행시키면 결과는 아래와 같이 나옴

name : A / email : test@test.com / phone : no phone
name : B / email : no email / phone : no phone
name : C / email : test2@test.com / phone : no phone
name : D / email : no email / phone : 010-0101-0520

 

매개변수 갯수 때문에 오버로딩할 수고를 덜게 될지도...?

 

 

3. 열거형 매개변수를 사용하는 함수

private fun printNames(vararg names : String) {
    for(name in names) {
        println("name :: $name");
    };
}
printNames("A", "B", "C");
printNames("D", "E");

위의 코드를 실행시키면 결과는 아래와 같이 나옴

name :: A
name :: B
name :: C
name :: D
name :: E

 

'개발 > Kotlin' 카테고리의 다른 글

코틀린 공부 - 함수(3)  (0) 2021.08.02
코틀린 공부 - 함수(2)  (0) 2021.08.02
코틀린 기초 5 - object  (0) 2020.06.25
코틀린 기초 - 4(고차함수, 람다)  (0) 2020.06.24
코틀린 기초 - 3 (if~else, when)  (0) 2020.06.23

출처 : stackoverflow.com/a/29036233/14370831

 

Android: Unable to clear initial draw to SurfaceView

I've just started playing around with developing an Android app and have run into some troubles. The intention of this testing app is to draw a square to the screen that moves towards the bottom r...

stackoverflow.com

 

화면 전체에 꽃을 뿌려줘야 할 일이 생겼다.

처음에는 그냥 View로 만들었다가..

이런 건 SurfaceView로 만들어줘야한다는 말을 듣고 SurfaceView를 상속받도록 수정하였음.

 

그런데...

 

 

왜인진 모르겠으나 맨 처음에 찍혔던 게 사라지지 않고 남아있는 것이다!

 

뭐지? 하면서 스택오브플로우를 열심히 찾았는데..

 

답은 허탈할 정도로 간단했음.

 

 

보통 SurfaceView에 애니메이션을 줄 때 코드를 이런 식으로 짤 것이다.

화면에 뭔가를 표시하려고 draw 메소드를 오버라이딩하는데..

 

draw메소드를 오버라이딩하지 않고 그냥 다른 이름으로 메소드를 만들어서 사용하면 된다.

 

 

 

 

허무할 정도 -_- .. 

검색하면 여러 방법이 있는데

 

1.

[Build]-[Clean Project] 하기

 

2. 

[File]-[Sync Project with Gradle Files] 하기

 

3. 

settings.gradle에 있는 내용 지우고 Gradle Sync 한 다음

다시 settings.gradle의 내용 복원시키고 Gradle Sync 하기

 

4.

모듈의 build.gradle 에 들어가서

맨 윗부분이 apply plugin: 'com.android.application' 인지 확인하기

 

5. 

Project를 닫았다가 Open Project가 아니라 Import Project를 통해서 불러오기

stackoverflow.com/a/21295700/14370831

 

Android Studio: Module won't show up in "Edit Configuration"

I've imported a project to Android Studio with several subprojects. I want to run a subproject. I successfully made this subproject's build.gradle as a module. In order to run it, I went to R...

stackoverflow.com

 

난 세시간 헤매다가 5번으로 해결했음 ㅠㅠ

 

이번에 회사에서 작업을 하는데

이런 뷰를 만들어야 할 일이 생겼다.

이전에는 \n과 스페이스(또는 공백문자)로 맞추려고했으나, 안드로이드는 워낙 지원하는 단말기가 많아 각 단말기별/폰트별로 결과물에 차이가 발생하였다.

 

검색해보니 LeadingMarginSpan이라는 게 있었는데 적용해보니 이런 식으로 되는 것을 확인함.

\n으로 인한 줄바꿈은 무조건 새로운 줄이라고 인식해서 그런 것 같았다.

 

public abstract class LeadingSubTextSpan implements LeadingMarginSpan {
    int leading=10;   //얼마만큼 들여쓰기 할 건지

    private int margin=0;

    public LeadingSubTextSpan(int leading) {
        this.leading = leading;
    }

    public abstract boolean isSubText(String text);    //여백 줘야 하는 줄인지 체크하는 메소드

    @Override
    public int getLeadingMargin(boolean b) {
        return margin;
    }

    @Override
    public void drawLeadingMargin(Canvas c, Paint p, int x, int dir, int top, int baseline, int bottom, CharSequence text, int start, int end, boolean isFirst, Layout layout) {
        int m = 0;
        if(start > 0){
            String t = text.toString().substring(start-1);
            if(t.startsWith("\n") && isSubText(t)) {
                m = leading;
            }
        }
        margin = m;
    }
}

abstract 클래스이고, isSubText()라는 메소드를 통해 줄바꿈을 할 것인지 판단하도록 하였다. 인자로 넘기는 text는 각 줄의 텍스트..

사용할 때는 아래와 같이 사용한다.

SpannableStringBuilder b = new SpannableStringBuilder(stringBuilder);
int leading = 100;
b.setSpan(new LeadingSubTextSpan(leading) {
    @Override
    public boolean isSubText(String text) {
        return !text.startsWith("\n*");
    }
}, 0, b.length(), 0);
textView.setText(b);

leading 부분에 숫자를 넣어도 되지만

textView.getPaint().measureText("가나다");

이런 식으로 하면 해당 textView에서 '가나다'라는 String이 표시될 때의 너비를 가져올 수 있으니

활용해서 사용하는 게 편할 것 같다.

 

음.. 이런 기능을 지원하지 않았다는 게 좀 신기할 따름인데

알고보니 원래 있었던 기능인데 내가 몰랐을 수도 있겠다는 생각이 드네 ㅜㅜ ..

기존에 API로 제공한다면 알려주시길 바람!

+ Recent posts